考虑这个简单的例子:协变型FParam发生在逆变位置类型的值序号[FParam]猜测
trait Optimizer[+FParam, FRes] {
def optimize(
fn: (FParam) => FRes,
guesses: Seq[FParam] // <--- error
)
}
它不编译,因为
协变型
FParam
在逆变发生在价值猜测Seq[FParam]
类型的位置。
但是seq被定义为trait Seq[+A]
,那么这个反变量的来源是什么? (问题1)
相反地,考虑这个简单的例子与-FParam
:在协变位置发生
trait Optimizer[-FParam, FRes] {
def optimize(
fn: (FParam) => FRes, // <--- error
guesses: Seq[FParam]
)
}
反变型在型
(FParam) => FRes
再次,相同的矛盾:在Function1[-T1, R]
,第一个类型参数显然是逆变的,那么为什么FParam
处于协变位置? (Question2)
我可以通过翻转Lower type bounds中描述的方差来解决这个问题,但为什么它有必要不清楚。
trait Optimizer[+FParam, FRes] {
type U <: FParam
def optimize(
fn: (FParam) => FRes,
guesses: Seq[U]
)
}