One interesting thing that has probably gone unnoticed by most, however, is that it can do more than what the old pattern matcher did, in at least one respect: it can match against abstract types, provides a ClassTag.
To understand that better, consider this REPL session on Scala 2.9.2:
scala> def f[T: ClassManifest](l: List[Any]) = l collect { | case x: T => x | } <console>:8: warning: abstract type T in type pattern T is unchecked sin ce it is eliminated by erasure case x: T => x ^ f: [T](l: List[Any])(implicit evidence$1: ClassManifest[T])List[T] scala> f[String](List(1, 2.0, "three")) res0: List[String] = List(1, 2.0, three)
Now let's look at what can be done with Scala 2.10.0:
scala> import scala.reflect.ClassTag import scala.reflect.ClassTag scala> def f[T: ClassTag](l: List[Any]) = l collect { | case x: T => x | } f: [T](l: List[Any])(implicit evidence$1: scala.reflect.ClassTag[T])List [T] scala> f[Int](List(1, 2.0, "three")) // It can't find Int because they are boxed res0: List[Int] = List() scala> f[String](List(1, 2.0, "three")) // But AnyRefs are ok res1: List[String] = List(three)
Note that it doesn't reify types -- that is, it can't tell whether your List[Any] is a List[String], but it does go a bit further than what was possible before.