当前位置: 首页 > 知识库问答 >
问题:

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

西门奇希
2023-03-14

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

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]可以用来实现更好的类型安全。但是我在这里关心的是为什么没有针对第二个case子句发出未检查的警告。据我所知,类型参数K也被删除了,根据Java泛型常见问题

当编译器发现目标类型为参数化类型或类型参数的强制转换时,也会报告“未检查”警告

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

共有1个答案

松博耘
2023-03-14

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

 类似资料:
  • 假设我有一个map。现在我只想从中获取条目并创建一个新的map与这些条目。 我正在尝试做以下事情: 这似乎可行,但我得到了一个警告:类型模式(String,Int)中的非变量类型参数字符串未选中,因为它已被擦除消除。 我怎样才能摆脱警告?

  • IntelliJ Idea对我的测试用例中的一个语句发出以下警告。 警告:为varargs参数创建未经检查的泛型数组 编译器发出未经检查警告的位置 我所做的就是:

  • 我不明白为什么我收到以下代码的警告: 未选中对<code>isAssignableFrom(类)的调用 当我使用< code>isInstance方法时(根据我的理解,它提供相同的结果),我没有得到警告:

  • 问题内容: 考虑以下代码示例: 当用Java 7编译时,它只会产生预期的警告: 警告:(7,39)Java:要求进行未经检查的转换: 找到: 但是,在Java 8中进行编译时,它会为分配产生以下错误: 错误:(7,48)Java:不兼容的类型:无法转换为 因此,显然从返回的类型不是,而是被擦除(也可以通过IDE中的“提取变量”功能进行确认)。这很令人困惑,因为方法总是返回。 奇怪的是,可以通过在调

  • 我在这里遇到了一个关于带列表的泛型有界类型的小问题。请帮帮我! 有什么方法可以克服这个问题,或者我可以安全地压制警告吗?

  • 定义以下结构: 和下面的函数(请注意,第二行是类型检查错误点,它也是一个短路结果的算法错误,但它还是出现了,我想知道为什么类型检查没有发现它) 我知道scala也有类型擦除的问题,但我很惊讶在这种情况下,在编译时却检测不到这一点?在本例中是,而显然属于类型? 听起来这里有一个很长的解释https://gist.github.com/jkpl/5279EE05CCA8CC1EC452FC26ACE5