Scala使用模式匹配编译警告

时间:2014-03-10 17:09:18

标签: scala pattern-matching type-erasure

我有一个Akka Actor,它的接收方法具有以下大小写模式匹配检查,如下所示:

def receive = {
  case x: (String, ListBuffer[String]) if(x._2.size >= 0) => {
  .....
  .....
}

编译时,我会看到以下编译器警告:

warning: non-variable type argument String in type pattern (String, scala.collection.mutable.ListBuffer[String]) 
is unchecked since it is eliminated by erasure)

关于如何摆脱它们的任何线索?我不想将编译器设置设置为忽略这些警告,但我没有看到编译器发出警告的原因?

2 个答案:

答案 0 :(得分:3)

这是由于JVM的类型擦除。在运行时,JVM只能看到ListBuffer[Any]。泛型的静态类型信息丢失了。如果您不关心ListBuffer的泛型类型,可以将模式匹配更改为:

case x: (String, ListBuffer[_]) if(x._2.size >= 0) =>

答案 1 :(得分:2)

我喜欢用于此问题的一个小技巧是类型别名。

type MyBuffer = ListBuffer[String]

//...

def receive = {
  case x: (String, MyBuffer) if(x._2.size >= 0) => {
  //.....
  //.....
}