Параметр типа обходит предупреждение об исчерпании совпадений

Почему параметр типа, связанный с запечатанным типом, кажется, не вызывает предупреждение об исчерпании возможностей

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

person Mario Galic    schedule 19.05.2020    source источник
comment
Похоже на ошибку.   -  person Luis Miguel Mejía Suárez    schedule 19.05.2020


Ответы (1)


Сопоставление с образцом

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

может быть исчерпывающим или неполным в зависимости от T.

(T <: A не означает, что T равно B или C, см. 1 2 3).

Согласно спецификации

Если селектор сопоставления с образцом является экземпляром запечатанного класса, компиляция сопоставления с образцом может выдавать предупреждения, которые диагностируют, что данный набор образцов не является исчерпывающим, т. Е. Существует вероятность возникновения MatchError во время выполнения .

Таким образом, компилятор может, но не должен выдавать предупреждение.

person Dmytro Mitin    schedule 19.05.2020