Scala:不正确的警告"匹配可能不是详尽的"

时间:2016-01-25 13:57:47

标签: scala

请考虑以下代码段:

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 _ =>
}

1 个答案:

答案 0 :(得分:5)

我认为这是因为bar的类型是超类型(bar可以是B1B2,唯一常见的类型是{ {1}}),理论上它仍然可能是Bar,并且编译器对此不够聪明:

B3

无论如何,当你有一个具有相同结果的平面匹配时,有一个嵌套匹配的重点是什么?