在 Scala 中,为什么不对类型参数发出未经检查的警告?
In Scala, why unchecked warning is not issued for type arguments?
我大致了解什么是类型擦除以及为什么我们会遇到未经检查的警告。但是,我不明白为什么在以下情况下只发出一个未经检查的警告:
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"))
}
不幸的是,两个接听电话都匹配 case 子句。编译器确实对第一个子句发出了警告:
Warning: non-variable type argument Double in type pattern List[Double] is unchecked since it is eliminated by erasure.
我知道 TypeTag[T] 可以用来实现更好的类型安全。但我在这里担心的是,为什么没有针对第二个 case 子句发出未经检查的警告。据我所知,类型参数 K 也被删除并根据 Java Generics FAQ
"unchecked" warnings are also reported when the compiler finds a cast whose target type is either a parameterized type or a type parameter
所以我想知道为什么没有未经检查的警告?
这可能是一个错误。 SI-9188 开放。
我大致了解什么是类型擦除以及为什么我们会遇到未经检查的警告。但是,我不明白为什么在以下情况下只发出一个未经检查的警告:
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"))
}
不幸的是,两个接听电话都匹配 case 子句。编译器确实对第一个子句发出了警告:
Warning: non-variable type argument Double in type pattern List[Double] is unchecked since it is eliminated by erasure.
我知道 TypeTag[T] 可以用来实现更好的类型安全。但我在这里担心的是,为什么没有针对第二个 case 子句发出未经检查的警告。据我所知,类型参数 K 也被删除并根据 Java Generics FAQ
"unchecked" warnings are also reported when the compiler finds a cast whose target type is either a parameterized type or a type parameter
所以我想知道为什么没有未经检查的警告?
这可能是一个错误。 SI-9188 开放。