在Scala中,为什么不为类型参数发出未经检查的警告?

cfc*_*hou 14 jvm scala type-erasure

我一般都了解什么类型的擦除以及为什么我们会遇到未经检查的警告.但是,我不明白为什么在以下情况下只发出一个未经检查的警告:

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"))
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,两个接收呼叫都匹配案例条款.编译器确实对第一个子句发出警告:

警告:类型模式中的非变量类型参数Double [Double]未选中,因为它已被擦除消除.

我知道TypeTag [T]可以用来实现更好的类型安全性.但我关注的是为什么没有为第二个案件条款发出未经检查的警告.据我所知,类型参数K也被删除,并根据Java Generics FAQ

当编译器找到目标类型为参数化类型或类型参数的强制类型转换时,也会报告"未选中"警告

所以我想知道为什么不存在未经检查的警告?

cfc*_*hou 0

这可能是一个错误。SI-9188对此开放。