【发布时间】:2018-01-16 03:40:24
【问题描述】:
考虑这个简单的例子:
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 处于协变位置? (问题2)
我可以按照Lower type bounds 中的描述翻转方差来解决此问题,但为什么需要这样做尚不清楚。
trait Optimizer[+FParam, FRes] {
type U <: FParam
def optimize(
fn: (FParam) => FRes,
guesses: Seq[U]
)
}
【问题讨论】:
标签: scala covariance contravariance scala-generics