trait Base[K <: Option[Int]]
just says that: There is a type K
which is subtype of Option[Int]
. Your second part GaranteedA
shows exactly why your Base
definition cannot pretend that None
is a subtype of K
—imagine that you did not override val a
. You would end up having value None
cast to a Some
.
Just because K
is a subtype of Option[Int]
and None
is a subtype of Option[Int]
, does not guarantee that None
is a subtype of K
.