我正在尝试编译下面的代码,尽管编译器拒绝它,但它看起来是正确的。我可能做错了什么或者我需要以某种方式提示编译器。
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)
}
}
}