【发布时间】:2015-12-20 01:48:01
【问题描述】:
我有以下陈述。
val a: Any = Array("1", "2", "3")
a match {
case p: Array[Int] => println("int")
case l: Array[String] => println("string")
}
val b: Any = List(1, 2, 3)
b match {
case l: List[String] => println("string")
case p: List[Int] => println("int")
}
关于 Array 的第一个代码块编译时没有警告并输出“string”,而关于 List 的第二个代码块编译时出现与类型擦除相关的警告并输出“string”。
我对 JVM 中的类型擦除有所了解。在运行时,JVM 无法真正知道容器的泛型类型(例如 List)。但是为什么 Array 可以避免运行时的类型擦除并获得正确的类型匹配呢?
我试图从 scala 源代码中找到答案。我唯一发现的是 Array 使用 ClassTag 而 List 没有。
我想了解 ClassTag 的工作原理。 ClassTag 是类型擦除的解决方法吗?以及为什么没有使用 ClassTag 实现像 List 这样的容器以避免类型擦除。
【问题讨论】:
标签: scala pattern-matching type-erasure