自我类型不符合基类

Mar*_*ijn 2 generics polymorphism scala scala-generics

使用以下代码:

trait Hello[B <: Baz[_, _]]
trait World[F <: Foo] { self: Hello[Baz[F, _]] =>

  def foo: F

}
trait Baz[F <: Foo, B <: Bar]
trait Foo
trait Bar

case class BasicHello() extends Hello[BasicBaz] with World[BasicFoo]
case class BasicBaz() extends Baz[BasicFoo, BasicBar]
case class BasicFoo() extends Foo
case class BasicBar() extends Bar
Run Code Online (Sandbox Code Playgroud)

我在BasicHello案例类的IDE中收到以下错误:

Illegal inheritance, self-type BasicHello does not conform to Hello[Baz[F, _]]
Run Code Online (Sandbox Code Playgroud)

我不知道为什么编译器不允许这样,因为BasicHello扩展Hello[BasicBaz],反过来扩展Baz[BasicFoo, BasicBar].该类型BasicHello应该是Hello[Baz[Foo, Bar]]这是什么World混入物要求.我是否缺少一些自我类型的等级属性?

Dim*_*ima 5

问题是它Hello是不变的B.所以,即使是子Hello[BasicBaz]类,Hello[Baz[BasicFoo,BasicBar]]也不BasicBaz是子类Baz.

如果你HelloB(trait Hello[+B <: Baz[_,_]])中进行协变,那么它就会编译.

  • 如果`Hello`不能变成协变,那么像这样查找自我类型的注释也可以做到这一点:`self:Hello [_ <:Baz [F,_]] =>` (3认同)