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

时间:2015-02-25 15:23:34

标签: scala jvm 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"))
}

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

  

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

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

  

"未选中"当编译器找到目标类型为参数化类型或类型参数

的强制类型转换时,也会报告警告

所以我想知道为什么没有未经检查的警告?

1 个答案:

答案 0 :(得分:0)

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