这个文件:
object Test extends App {
val obj = List(1,2,3) : Object
val res = obj match {
case Seq(1,2,3) => "first"
case _ => "other"
}
println(res)
}
给出这个警告:
Test.scala:6: warning: non variable type-argument A in type pattern Seq[A]
is unchecked since it is eliminated by erasure
case Seq(1,2,3) => "first"
Scala版本2.9.0.1 .
我没有看到如何执行匹配需要擦除类型参数 . 第一个案例子句是为了询问obj是否是一个3个元素等于1,2和3的Seq .
如果我写了类似的东西,我会理解这个警告:
case strings : Seq[String] => ...
为什么我会收到警告,什么是让它消失的好方法?
顺便说一句,我确实希望与静态类型的Object匹配 . 在实际代码中,我正在解析类似于Lisp基准的东西 - 它可能是一个字符串,基准序列,符号,数字等 .
2 回答
以下是对场景背后发生的事情的一些见解 . 考虑以下代码:
如果使用
scalac -Xprint:12 -unchecked
进行编译,则会在擦除阶段(id 13)之前看到代码 . 对于第一种类型的模式,您将看到如下内容:对于
Seq
提取器模式,您将看到如下内容:在这两种情况下,都有一个类型测试,以查看对象是否为
Seq
(Seq[Int]
和Seq[A]
)类型 . 在擦除阶段将消除类型参数 . 因此警告 . 即使第二个可能是意外的,检查类型也是有意义的,因为如果对象不是Seq
类型,则该子句将不匹配,并且JVM可以继续执行下一个子句 . 如果类型匹配,则可以将对象转换为Seq
并且可以调用unapplySeq
.RE:thoredge评论类型检查 . 可能我们正在谈论不同的事情 . 我只是说:
转换为:
使用类型检查,以便在完成转换时没有类转换异常 .
类型模式Seq [A]中的警告非变量类型参数A是否未被选中,因为它被擦除消除是合理的,并且是否存在可能存在类别转换异常的情况,即使使用类型检查,我也不知道 .
编辑:这是一个例子:
在外面声明匹配对象至少会让它消失,但我不确定为什么: