4

使用以下代码:

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, _]]

我不知道为什么编译器不允许这样做,因为BasicHelloextends Hello[BasicBaz],而后者又是 extends Baz[BasicFoo, BasicBar]。的类型BasicHello应该Hello[Baz[Foo, Bar]]正是World混入所需要的。是否有一些我缺少自我类型的分层属性?

4

1 回答 1

7

问题是它HelloB. 因此,即使是 的子Hello[BasicBaz]类,也不是 的子类。Hello[Baz[BasicFoo,BasicBar]]BasicBazBaz

如果你在, ( ) 中进行Hello协变,那么它将编译。Btrait Hello[+B <: Baz[_,_]]

于 2017-07-11T01:01:21.603 回答