The part that you&#x27;re missing is that code like this in Scala is totally unnecessary and it never happens:<p><pre><code>    case ns : List[Int] =&gt;
</code></pre>
Worst case scenario, you can always do the following and it would be more idiomatic, no type erasure standing in the way:<p><pre><code>    val listInt = listAny.collect { case x:Int =&gt; x }
    val listDouble = listAny.collect { case x:Double =&gt; x }
</code></pre>
But even that is totally unnecessary. You know why? Because your function does not make sense. What could you possibly do with a function that takes a List[T] and returns a String?<p>The only way this would make sense would be if you are talking about a List[Any] deserialized from somewhere (like some shitty JSON library). But then in Scala we don&#x27;t really work with Any, that should never happen and if you see libraries that use Any in their API, drop them like they are hot ;-)<p>&gt; <i>Which is purely because of a JVM runtime limitation</i><p>No it&#x27;s not. Talk to compiler authors. This is actually a <i>freedom</i>, because by introducing reified generics in the runtime, then language designers either have to deal with inefficiencies due to boxing because of extra conversions, or to limit their type system, so for example you can say goodbye to higher-kinded types. A runtime that has reified generics is not a multi-language runtime. In fact many languages are doing type erasure. Haskell is doing type erasure. And why shouldn&#x27;t it, I mean, type casting and isInstanceOf checks make no sense in Haskell.