【问题标题】:Scala compile warning with pattern matching [duplicate]带有模式匹配的Scala编译警告[重复]
【发布时间】:2014-04-13 22:34:56
【问题描述】:

我有一个 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)

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

【问题讨论】:

  • Scala 在运行时只能从 x 看到它是一个 Tuple2,所以如果一个 Tuple2 带有不同的类型参数,那可能是一个真正的问题。

标签: scala pattern-matching type-erasure


【解决方案1】:

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

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

【讨论】:

  • 这意味着我必须先将 x._2 转换为 ListBuffer[String] 才能使用它。不太理想!
【解决方案2】:

我喜欢使用的一个小技巧是类型别名。

type MyBuffer = ListBuffer[String]

//...

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

【讨论】:

  • 除了这根本不能解决实际问题。
  • @AlexeyRomanov 试试看。编译器不会抛出警告。他只是想让警告消失。
  • 问题是他没有看到警告的原因,看问题的最后一句。
  • @AlexeyRomanov 当然,我没有解决真正的问题或回答他的最后一个问题。但是,如果它真的是“不在乎”,那么这是绕过它的另一个方便的技巧。感谢您清理它。 :)
  • 我尝试使用类型别名,但警告仍然存在!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 2016-05-17
  • 2022-06-21
相关资源
最近更新 更多