Using the following code:
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
I get the following error in my IDE at the BasicHello
case class:
Illegal inheritance, self-type BasicHello does not conform to Hello[Baz[F, _]]
I have no clue why the compiler doesn't allow this since BasicHello
extends Hello[BasicBaz]
, which in its turn extends Baz[BasicFoo, BasicBar]
. The type of BasicHello
should be Hello[Baz[Foo, Bar]]
which is exactly what the World
mix-in requires. Is there some hierarchical property I'm missing of self-types?
The problem is that Hello
is invariant in B
. So, Hello[BasicBaz]
is not a subclass of Hello[Baz[BasicFoo,BasicBar]]
even though BasicBaz
is a subclass of Baz
.
If you make Hello
covariant in B
, (trait Hello[+B <: Baz[_,_]]
), then it'll compile.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With