请考虑以下代码段:
sealed abstract class Bar
object B1 extends Bar
object B2 extends Bar
object B3 extends Bar
case class A(bar:Bar)
def foo(a:A) = a match {
case A(bar@(B1|B2)) =>
bar match { // gives warning here
case B1 =>
case B2 =>
}
case _ =>
}
在上文中,我确保第一个案例仅在A
类型为A(B1)
或A(B2)
时才匹配(至少我认为这意味着什么) 。但是,我收到以下错误:
warning: match may not be exhaustive.
It would fail on the following input: B3
bar match {
^
任何人都可以详细说明警告的来临吗?
编辑:在答案之后,似乎编译器将bar
键入为Bar
而不记住它是匹配的。这绝对不是一个bug。编译器非常聪明,不会在下面发出警告:
sealed abstract class Bar
object B1 extends Bar
object B2 extends Bar
object B3 extends Bar
case class A(bar:Bar)
def foo(a:A) = a match {
case A(B1|B2) =>
a match { // no warning
case A(B1) =>
case A(B2) =>
}
case _ =>
}
答案 0 :(得分:5)
我认为这是因为bar
的类型是超类型(bar
可以是B1
或B2
,唯一常见的类型是{ {1}}),理论上它仍然可能是Bar
,并且编译器对此不够聪明:
B3
无论如何,当你有一个具有相同结果的平面匹配时,有一个嵌套匹配的重点是什么?