加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 为什么这个擦除警告与成员变量声明为一个元组?

发布时间:2020-12-16 19:02:10 所属栏目:安全 来源:网络整理
导读:看看这个 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,2) ^ 删除显式类型注
看看这个 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,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]类型的右侧对象,并调用方法在Tuple2协同对象上取消应用[Int,Int].取消应用[Int,Int]将验证对象确实具有类型Tuple2,并且其结果值将用于将值绑定到变量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] => 
}

你会得到类似的警告.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读