考慮這個簡單的例子:協變型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]
)
}