我一般都了解什么类型的擦除以及为什么我们会遇到未经检查的警告 . 但是,我不明白为什么在以下情况下只发出一个未经检查的警告:
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
当编译器找到目标类型为参数化类型或类型参数的强制类型转换时,也会报告“未选中”警告
所以我想知道为什么不存在未经检查的警告?
1 回答
这可能是一个错误 . SI-9188是开放的 .