使用以下代码:
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
我在 IDE 的BasicHello
案例类中收到以下错误:
Illegal inheritance, self-type BasicHello does not conform to Hello[Baz[F, _]]
我不知道为什么编译器不允许这样做,因为BasicHello
扩展了Hello[BasicBaz]
,这反过来又扩展了Baz[BasicFoo, BasicBar]
。应该Hello[Baz[Foo, Bar]]
BasicHello
的类型,这正是World
混合所需的。自我类型是否缺少一些分层属性?
问题是Hello
在B
中是不变的。因此,Hello[BasicBaz]
不是Hello[Baz[BasicFoo,BasicBar]]
的子类,即使BasicBaz
是Baz
的子类。
如果你在B
中Hello
协变 , (trait Hello[+B <: Baz[_,_]]
(,那么它就会编译。