The following is a simplified version of my source code to make things easier (sorry, this is still a bit complicated):
trait BuilderBase
trait MessageBase {
type Builder <: BuilderBase
}
class SomeMessage extends MessageBase {
type Builder = SomeMessage.Builder
}
object SomeMessage {
class Builder extends BuilderBase
}
class Covariant[+T]
class NonCovariant[T]
def func[T <: MessageBase](value: Covariant[T]): Covariant[T#Builder] = null
val message: Covariant[SomeMessage] = null
val result: Covariant[SomeMessage.Builder] = func(message)
And the last line will not compile with an error func(→ message ← here):
type mismatch; found: Covariant [SomeMessage] required: Covariant [SomeMessage.type]
Func definitely accepts the Covariant parameter from T, which is a subclass of MessageBase, which requires Covariant [SomeMessage], not Covariant [SomeMessage.type], because SomeMessage.type (the type of the SomeMessage companion object) does not match MessageBase.
, , , val result = func(message), , : Covariant [SomeMessage.Builder]. . ?
, , NonConvariant. . .
, , . . , , , , .