使用以下代码:
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
我在BasicHello
案例类的IDE中遇到以下错误:
Illegal inheritance, self-type BasicHello does not conform to Hello[Baz[F, _]]
我不知道为什么编译器不允许这样做,因为BasicHello
扩展Hello[BasicBaz]
,而Baz[BasicFoo, BasicBar]
扩展BasicHello
。 Hello[Baz[Foo, Bar]]
的类型应为World
,这正是app/AppKernel.php
混合所需的内容。是否有一些等级属性我缺少自我类型?
答案 0 :(得分:5)
问题是Hello
中的B
不变。因此,Hello[BasicBaz]
不是Hello[Baz[BasicFoo,BasicBar]]
的子类,即使BasicBaz
是Baz
的子类。
如果您在Hello
,(B
)中设置了trait Hello[+B <: Baz[_,_]]
协变,那么它就会编译。