Scala: wrong output type?

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. . .


, , . . , , , , .

+4
2

, , @AssafMendelson, :

trait BuilderBase

trait MessageBase {
  type Builder <: BuilderBase
}
class SomeMessage extends MessageBase {
  type Builder = 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)

,

+1

, , Builder Builder

SomeMessage.Builder , , .

: builder2 ( ) , , .

0

Source: https://habr.com/ru/post/1675276/


All Articles