相关疑难解决方法(0)

29
推荐指数
3
解决办法
3万
查看次数

如何在Scala中对泛型类型进行模式匹配?

我们假设我们有一个泛型类Container:

case class Container[+A](value: A)
Run Code Online (Sandbox Code Playgroud)

然后,我们希望模式匹配一个ContainerDoubleContainerAny:

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特定类型的参数化?

scala pattern-matching type-erasure

26
推荐指数
4
解决办法
2万
查看次数

标签 统计

java ×1

object ×1

oop ×1

pattern-matching ×1

scala ×1

type-erasure ×1