我通常了解什么类型的擦除以及为什么我们会遇到未经检查的警告。但是,我不明白为什么在以下情况下只发出一个未经检查的警告:
class A[K] {
def receive: PartialFunction[Any, Unit] = {
case ds: List[Double] => // unchecked warning
println("* List[Double]")
case kx: Vector[K] => // no unchecked warning
println("* Vector[K]")
}
}
object TestApp extends App {
val a = new A[Int]
a.receive(List("bar"))
a.receive(Vector("foo"))
}
不幸的是,两个接收电话匹配案例条款。编译器确实对第一个子句发出警告:
警告:类型模式中的非变量类型参数Double [Double]未选中,因为它被擦除消除了。
我知道 TypeTag [T] 可用于实现更好的类型安全性。但我关注的是为什么没有为第二个案件条款发出未经检查的警告。据我所知,类型参数 K 也会被删除,并根据Java Generics FAQ
"未选中"当编译器找到目标类型为参数化类型或类型参数
的强制类型转换时,也会报告警告
所以我想知道为什么没有未经检查的警告?