我们假设我们有一个泛型类Container:
case class Container[+A](value: A)
Run Code Online (Sandbox Code Playgroud)
然后,我们希望模式匹配一个Container有Double和Container的Any:
val double = Container(3.3)
var container: Container[Any] = double
Run Code Online (Sandbox Code Playgroud)
为此,我们通常会写:
container match {
case c: Container[String] => println(c.value.toUpperCase)
case c: Container[Double] => println(math.sqrt(c.value))
case _ => println("_")
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器会给出两个警告,前两个案例各一个.例如,第一个警告说:"类型模式容器[String]中的非变量类型参数字符串未被选中,因为它被擦除".由于擦除,在运行期间不可能区分不同类型的容器并且第一个捕获物将匹配.因此,类型的容器Container[Double]将与捕获Container[String]对象的第一个案例匹配,因此toUpperCase将在a上调用方法,Double并且java.lang.ClassCastException将抛出a.
如何匹配Container特定类型的参数化?