事实上,当嵌入到正确的上下文中时,您的代码在运行时会抛出匹配错误:
class Foo {
val set1 = Set(1,2,3,4,5,67,8)
val TRUE_BOOLEAN = true
val FALSE_BOOLEAN = false
set1.contains(4) match {
case TRUE_BOOLEAN => println("Element found")
case FALSE_BOOLEAN => println("Element not found")
}
}
class Bar extends Foo {
override val TRUE_BOOLEAN = false
}
new Bar // scala.MatchError: true (of class java.lang.Boolean)
所以警告是
而不仅仅是一个过于保守的估计。由于每个Scala脚本都隐式地嵌入到某个“类”包装器中,因此它在Scala脚本中的工作方式也完全相同,即使您没有将其包装到
Foo
-班级。
如果将两个变量都设置为
final
,则常数传播工作正常,不会发出警告:
class Foo {
val set1 = Set(1,2,3,4,5,67,8)
final val TRUE_BOOLEAN = true
final val FALSE_BOOLEAN = false
set1.contains(4) match {
case TRUE_BOOLEAN => println("Element found")
case FALSE_BOOLEAN => println("Element not found")
}
}
编译得很好,没有警告。