Self-тип не соответствует базовому классу

Используя следующий код:

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], Тип BasicHello должно быть Hello[Baz[Foo, Bar]] что именно то, что World требуется смешивание Есть ли какое-то иерархическое свойство, которое мне не хватает для самоподтипов?

1 ответ

Решение

Проблема в том, что Hello инвариантен в B, Так, Hello[BasicBaz] не подкласс Hello[Baz[BasicFoo,BasicBar]] даже если BasicBaz это подкласс Baz,

Если вы делаете Hello ковариантный в B, (trait Hello[+B <: Baz[_,_]]), то скомпилируется.

Другие вопросы по тегам