次の簡単な例を考えてみましょう。
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]
)
}