gpt4 book ai didi

Scala:错误警告 "match may not be exhaustive"

转载 作者:行者123 更新时间:2023-12-02 09:29:01 28 4
gpt4 key购买 nike

考虑以下代码片段:

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 而不记得它是匹配的。这绝对不是一个错误。编译器足够聪明,不会在以下情况下发出警告:

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

最佳答案

我想这是因为给 bar 的类型是父类(super class)型(bar 可以是 B1B2 > 唯一常见的类型是 Bar),因此理论上它仍然可能是 B3 并且编译器对此不够智能:

def foo(a:A) = a match {
case A(bar@(B1|B2)) =>
bar match { // bar here has a Bar type
case B1 =>
case B2 =>
}
case _ =>
}

无论如何,当您可以进行具有相同结果的平面匹配时,进行嵌套匹配有何意义?

关于Scala:错误警告 "match may not be exhaustive",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34994385/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com