Generics in C# and generics in Scala have the same basic features (generic classes&#x2F;interfaces&#x2F;methods). When I say &quot;powerful&quot;, the first thing that comes to mind is its ongoing reflection evolution. TypeTags give us access to class information in a functional manner (by passing in an implicit type info object) that we can take advantage of using Scala&#x27;s (also powerful) matching mechanism.<p>The second thing that comes to mind is the ability to support variance. To quote Twitter Scala School: &quot;A central question that comes up when mixing OO with polymorphism is: if T’ is a subclass of T, is Container[T’] considered a subclass of Container[T]?&quot; Scala allows us to express this information using +&#x2F;- as in `Container[+D]` allows for subclasses of `D`.<p>Finally, though not so much related, an interesting development in the type space is type macros (<a href="http:&#x2F;&#x2F;docs.scala-lang.org&#x2F;overviews&#x2F;macros&#x2F;typemacros.html" rel="nofollow">http:&#x2F;&#x2F;docs.scala-lang.org&#x2F;overviews&#x2F;macros&#x2F;typemacros.html</a>). This will give us a stronger &quot;generic&quot; approach to programming that allows us to write code to construct type hierarchies. In general, Scala is moving fast and always evolving.<p>You&#x27;d have to be more specific as to what your problems are concerning boxing &amp; jvm. Lists are properly specialized such that a = List(1) == List&lt;Int&gt; and a(0) == Int. Of course, if you use a diverse set of types in the list, you&#x27;ll have a `List&lt;Any&gt;` which then you would use `match` like so...
match item {
  case i:Int =&gt; println(&quot;int &quot; + i)
  case s:String =&gt; println(&quot;string &quot; + s)
}