dieses einfache Beispiel betrachten:Covariant Typ FParam tritt in kontra Position in Art Seq [FParam] Wert errät
trait Optimizer[+FParam, FRes] {
def optimize(
fn: (FParam) => FRes,
guesses: Seq[FParam] // <--- error
)
}
Es kompiliert nicht, weil
Covariant Typ
FParam
in kontra auftritt Position im TypSeq[FParam]
von Wertschätzungen.
Aber seq ist definiert als trait Seq[+A]
, also was ist die Quelle dieser Kontravarianz? (Frage 1)
Umgekehrt betrachten dieses einfache Beispiel mit -FParam
:
trait Optimizer[-FParam, FRes] {
def optimize(
fn: (FParam) => FRes, // <--- error
guesses: Seq[FParam]
)
}
kontra Typ tritt in kovarianten Position in Art
(FParam) => FRes
Auch hier das gleiche paradox: in Function1[-T1, R]
, der erste Typparameter ist eindeutig kontravariant, also warum ist FParam
in einer kovarianten Position? (Question2)
Ich kann dieses Problem beheben, indem Sie die Varianz wie in Lower type bounds beschrieben spiegeln, aber warum es notwendig ist, ist unklar.
trait Optimizer[+FParam, FRes] {
type U <: FParam
def optimize(
fn: (FParam) => FRes,
guesses: Seq[U]
)
}