Я пытаюсь скомпилировать приведенный ниже код, который выглядит правильно, но компилятор отказывается от него. Наверное я что-то не так делаю или надо как-то подсказать компилятору.
sealed trait Foo[A]
case class Bar[A, B <: A]() extends Foo[A]
class Visitor[A](foo: Foo[A]) {
def onBar[B <: A](bar: Bar[A, B]) = ???
def run = foo match
case b: Bar[A, b] => onBar[b](b)
}
Ошибка
Аргумент типа b не соответствует верхней границе A





Эта проблема в настоящее время обсуждается по адресу scala/scala3#20040, и достоверность кода вопроса будет подтверждена после разрешения этого отчета. На данный момент существует два обходных пути:
Foo и Bar, вы можете написать метод fold, чтобы обойти необходимость сопоставления с образцом:sealed trait Foo[A] {
def fold[R](caseBar: [B <: A] => Bar[A, B] => R): R
}
case class Bar[A, B <: A]() extends Foo[A] {
override final def fold[R](caseBar: [B <: A] => Bar[A, B] => R) =
caseBar[B](this)
}
class Visitor[A](foo: Foo[A]) {
def onBar[B <: A](bar: Bar[A, B]) = ???
def run = foo.fold([B <: A] => (b: Bar[A, B]) => onBar[B](b))
}
match, который заставит компилятор запомнить, что B связан с A:sealed trait Foo[A]
case class Bar[A, B <: A]() extends Foo[A]
class Visitor[A](foo: Foo[A]) {
def onBar[B <: A](bar: Bar[A, B]) = ???
def run = foo match {
case bar1: Bar[A, ? <: A] =>
bar1 match {
case bar2: Bar[A, b] =>
onBar[b](bar2)
}
}
}