自身类型不符合基类

5
使用以下代码:
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],而Hello[BasicBaz]又扩展了Baz[BasicFoo, BasicBar]BasicHello的类型应该是Hello[Baz[Foo, Bar]],这正是World混入所需的类型。我是否缺少一些自身类型的层次性质?

1个回答

7
问题在于HelloB中是不变的。因此,即使BasicBazBaz的子类,Hello[BasicBaz]也不是Hello[Baz[BasicFoo,BasicBar]]的子类。
如果您将HelloB中协变(trait Hello[+B <: Baz[_,_]]),那么它将编译。

3
如果 Hello 不能变成协变的,改变自身类型注释就可以解决问题:self: Hello[_ <: Baz[F, _]] => - Régis Jean-Gilles
不错!没想到那个。 - Dima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接