Scala编译警告与模式匹配

Scala编译警告与模式匹配,scala,pattern-matching,type-erasure,Scala,Pattern Matching,Type Erasure,我有一个Akka Actor,其接收方法中有以下case模式匹配检查,如下所示: def receive = { case x: (String, ListBuffer[String]) if(x._2.size >= 0) => { ..... ..... } 编译时,我会看到以下编译器警告: warning: non-variable type argument String in type pattern (String, scala.collection.mut

我有一个Akka Actor,其接收方法中有以下case模式匹配检查,如下所示:

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)

有什么线索可以帮我摆脱他们吗?我不想将编译器设置设置为忽略这些警告,但我看不出编译器发出警告的原因?

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

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

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

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

对于这个问题,我喜欢使用的一个小技巧是类型别名

type MyBuffer = ListBuffer[String]

//...

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

对于这个问题,我喜欢使用的一个小技巧是类型别名

type MyBuffer = ListBuffer[String]

//...

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

Scala只在运行时从x中看到它是一个Tuple2,因此如果Tuple2带有不同的类型参数,这可能是一个真正的问题。Scala只在运行时从x中看到它是一个Tuple2,因此如果Tuple2带有不同的类型参数,这可能是一个真正的问题。不过这根本不能解决实际问题。@AlexeyRomanov试试看。编译器不会抛出警告。他只是想让警告消失。问题是他没有看到警告的原因,没有看到问题的最后一句话。@AlexeyRomanov当然,我没有解决真正的问题,也没有回答他最后的问题。但如果这真的是一个“不在乎”,那么这是另一个绕过它的简便方法。谢谢你把它清理干净。:)我尝试使用类型别名,但警告仍然存在!除非这根本不能解决实际问题。@AlexeyRomanov试试看。编译器不会抛出警告。他只是想让警告消失。问题是他没有看到警告的原因,没有看到问题的最后一句话。@AlexeyRomanov当然,我没有解决真正的问题,也没有回答他最后的问题。但如果这真的是一个“不在乎”,那么这是另一个绕过它的简便方法。谢谢你把它清理干净。:)我尝试使用类型别名,但警告仍然存在!这意味着我必须先将x._2强制转换为ListBuffer[String],然后才能使用它。不太理想!这意味着我必须先将x._2强制转换为ListBuffer[String],然后才能使用它。不太理想!