【发布时间】:2013-04-10 00:21:37
【问题描述】:
假设我们有一个泛型类Container:
case class Container[+A](value: A)
然后我们希望将Container 与Double 和Container 的Any 进行模式匹配:
val double = Container(3.3)
var container: Container[Any] = double
为此,我们通常会这样写:
container match {
case c: Container[String] => println(c.value.toUpperCase)
case c: Container[Double] => println(math.sqrt(c.value))
case _ => println("_")
}
但是,编译器给出了两个警告,前两种情况各一个。例如,第一个警告说:“类型模式 Container[String] 中的非变量类型参数 String 未选中,因为它已被擦除消除”。由于擦除,在运行时无法区分不同种类的容器,并且会匹配第一个catch。因此,Container[Double] 类型的容器将与第一个 case 匹配,该 case 捕获 Container[String] 对象,因此将在 Double 上调用 toUpperCase 方法并抛出 java.lang.ClassCastException。
如何匹配由特定类型参数化的Container?
【问题讨论】:
-
我在那边添加了同一个问题的答案:link
标签: scala pattern-matching type-erasure