scala - 为什么这个删除警告与声明为元组的成员变量?

标签 scala compiler-warnings type-erasure

看看这个 Scala 类:

class Example {
  val (x, y): (Int, Int) = (1, 2)
}

编译它会导致警告:
Example.scala:2: warning: non variable type-argument Int in type pattern
               (Int, Int) is unchecked since it is eliminated by erasure
    val (x, y): (Int, Int) = (1, 2)
                ^

删除显式类型注释可以消除此警告:
class Example {
  val (x, y) = (1, 2)
}

为什么我会收到警告,为什么删除显式类型注释会摆脱它?据我所知,没有什么真正改变,xy仍然是 Int 类型没有类型注释。

最佳答案

您可以将示例重写为:

class Example {
  val Tuple2(x, y): Tuple2[Int, Int] = Tuple2(1, 2)
}

这个模式匹配实际上由 2 个匹配组成 - 它现在说:取类型为 Tuple2[Int, Int] 的右侧对象并调用方法unapply[Int, Int]Tuple2伴生对象。 unapply[Int, Int]然后将验证该对象确实具有类型 Tuple2 ,其结果值将用于将值绑定(bind)到变量 xy .

之后,此模式匹配包含 : Tuple2[Int, Int] ,因此它尝试执行 isInstanceOf[Tuple2[Int, Int]]动态检查对象是否还有类型 Tuple2[Int, Int] .但是,泛型类型信息在运行时会被删除,因此编译器会警告说它实际上无法生成验证对象是否为类型参数实例化的代码 [Int, Int] .

同样,在以下模式匹配中:
val a: AnyRef = (1, 2)
a match {
  case t2: Tuple[Int, Int] => 
}

你会得到一个类似的警告。

关于scala - 为什么这个删除警告与声明为元组的成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5223670/

相关文章:

generics - kotlin 在虚函数中具体化了泛型

web-services - Play : Binary webservice response

scala - Yarn 集群不能平等地管理 vcore,超出队列资源限制

c++ - (操作方法)获取编译器关于某个 c++ 年份的弃用/不推荐功能/构造的警告

c++ - 警告 C4127 : conditional expression is constant

c++ - 如何为具有类型删除数据成员的类实现复制构造函数?

scala - 以不同的方式链式运作

scala - 与 sbt 汇编的不及物依赖

c++ - 我应该担心 Boost 中带有 -O3 的编译器警告吗?

c++ - 虚拟模板化成员函数