Scala 警告匹配可能并不详尽
我正在尝试以下代码:Scala 警告匹配可能并不详尽,scala,pattern-matching,Scala,Pattern Matching,我正在尝试以下代码: 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") } 但是,当我试图在I
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")
}
但是,当我试图在IntelliJ
中运行它时,它会在消息
选项卡中发出以下警告:
Warning:(11, 16) match may not be exhaustive.
It would fail on the following inputs: false, true
set1.contains(4) match {
然而,如果我使用true
和false
而不是true\u BOOLEAN
和false\u BOOLEAN
,我不会得到任何警告
set1.contains(4) match {
case true => println("Element found")
case false => println("Element not found")
}
有人能解释一下这个警告的原因吗?为什么它会与
true
和false
一起消失?它会产生一个警告,因为它不能保证匹配是详尽的
事实上,当嵌入到正确的上下文中时,您的代码在运行时会抛出匹配错误:
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")
}
}
编译很好,没有警告。可能重复的即使我显式指定类型,仍然会收到警告。Scastie也给出了相同的警告,不管类型注释是否存在。不可复制。考虑重新标记它作为因特利耶夫bug。@ JuyGeHe如何这是你提出的副本?@ AndreyTyukin如提到的重复URL,<代码>在模式匹配中,你应该解释所有可能的情况或提供一个“回退”< /代码>如果你在代码中添加<代码>案例> <代码>,那么它就不会显示警告。您是对的…即使在显式添加类型之后,我也会收到警告。我将编辑我的问题。