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[_,_]]
), то скомпилируется.