自我类型不符合基类

时间:2017-07-11 00:41:00

标签: scala generics polymorphism 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

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

Illegal inheritance, self-type BasicHello does not conform to Hello[Baz[F, _]]

我不知道为什么编译器不允许这样做,因为BasicHello扩展Hello[BasicBaz],而Baz[BasicFoo, BasicBar]扩展BasicHelloHello[Baz[Foo, Bar]]的类型应为World,这正是app/AppKernel.php混合所需的内容。是否有一些等级属性我缺少自我类型?

1 个答案:

答案 0 :(得分:5)

问题是Hello中的B不变。因此,Hello[BasicBaz]不是Hello[Baz[BasicFoo,BasicBar]]的子类,即使BasicBazBaz的子类。

如果您在Hello,(B)中设置了trait Hello[+B <: Baz[_,_]]协变,那么它就会编译。