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,<代码>在模式匹配中,你应该解释所有可能的情况或提供一个“回退”< /代码>如果你在代码中添加<代码>案例> <代码>,那么它就不会显示警告。您是对的…即使在显式添加类型之后,我也会收到警告。我将编辑我的问题。