devine Considérons cet exemple simple:le type Covariant FPARAM se produit en position contravariant dans le type Seq [FPARAM] de la valeur
trait Optimizer[+FParam, FRes] {
def optimize(
fn: (FParam) => FRes,
guesses: Seq[FParam] // <--- error
)
}
Il ne compile pas, parce que
Type Covariant
FParam
se produit dans contravariante position dans le typeSeq[FParam]
des estimations de valeur.
Mais seq est défini comme trait Seq[+A]
, alors quelle est la source de cette contravariance? (Question 1)
A l'inverse, considérez cet exemple simple avec -FParam
:
trait Optimizer[-FParam, FRes] {
def optimize(
fn: (FParam) => FRes, // <--- error
guesses: Seq[FParam]
)
}
de type contravariant se produit en position covariante dans le type
(FParam) => FRes
Encore une fois, le même paradoxe: en Function1[-T1, R]
, le premier paramètre de type est clairement contravariant, alors pourquoi FParam
est-il dans une position covariante? (Question2)
Je peux résoudre ce problème en retournant la variance comme décrit dans Lower type bounds, mais pourquoi cela n'est pas clair.
trait Optimizer[+FParam, FRes] {
type U <: FParam
def optimize(
fn: (FParam) => FRes,
guesses: Seq[U]
)
}