看看这个 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)
}
为什么我会收到警告,为什么删除显式类型注释会摆脱它?据我所知,没有什么真正改变,
x
和 y
仍然是 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)到变量 x
和 y
.之后,此模式匹配包含
: 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/