1

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

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 {
    ^
4

1 回答 1

1

模式匹配

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

可以是详尽的或不详尽的,具体取决于T.

T <: A并不意味着TBor C,请参见1 2 3)。

根据规范

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

所以编译器可以但不是必须发出警告。

于 2020-05-19T03:53:10.503 回答