类型参数规避匹配穷举警告



为什么密封类型绑定的类型参数似乎不会引发穷举警告

sealed trait A
case class B() extends A
case class C(i: Option[Int]) extends A
def f[T <: A](a: T) =
a match {
case B() =>
case C(None) =>
}
f(C(Some(42))) // throws MatchError

虽然没有类型参数

def f(a: A) =
a match {
case B() =>
case C(None) =>
}

引发警告

warning: match may not be exhaustive.
It would fail on the following input: C(Some(_))
a match {
^

模式匹配

def f[T <: A](a: T) =
a match {
case B() =>
case C(None) =>
}

可以详尽无遗,也可以不详尽,具体取决于T

(T <: A并不意味着TBC,见1 2 3(。

根据规格

如果模式匹配

的选择器是密封类的实例,则模式匹配的编译可以发出警告,这些警告诊断给定的模式集并不详尽,即在运行时有可能引发MatchError

因此,编译器可以但不能发出警告。

相关内容

  • 没有找到相关文章

最新更新