为什么scala编译器不会在模式匹配中始终产生false的if语句生成警告?

时间:2013-04-23 18:10:46

标签: scala scala-compiler

scala编译器应该为我在下面评论过的if语句生成警告,但事实并非如此。为什么呢?

sealed trait T
object A extends T

val s:Seq[T] = Seq(A)

val result = s.map {
    //This if should produce a compiler warning
    case a if(a == "A") => 
        "First"
    case a => 
      //This if should produce a compiler warning
      if (a == "A") {
        "Second"
      }
      else
      {
        "Third"
      }
}

结果将是您所期望的“第三”,但编译器应该在case a if(a == "A")if (a == "A")上生成警告,但是没有警告。

如果我编写以下代码,它的行为就像我期望的那样:

if(A == "A"){
  println("can't happen")
}

// warning: comparing values of types A.type and String using `==' will always yield false

为什么会这样?

编辑:我正在使用Scala 2.10.1。

2 个答案:

答案 0 :(得分:1)

因为它可能发生。如果我只是保留一些内部状态并在第一次和第二次调用时返回==“A”的不同结果,那么我可以获得“第二次”。

您已经提供了A的定义,以确保它不会发生,但这需要检查整个程序,编译器警告只是本地的。

答案 1 :(得分:0)

愿你继承带有字符串参数的重载==方法的类......