Scalaの場合、Javaと異なり反変という概念がある。
型パラメタの前に +
をつければJavaなどと同じ共変、-
をつければ反変だ。
関数トレイトなどで
trait Function1[-S, +T] { //関数の定義
def apply(x: S): T
}
と使われる。
共変と反変の比較
A => B
は Function1[A, B]
の略記である。
引数にA=>B
をとるメソッドdef piyo(hoge: A => B){..
の引数に
関数リテラルhoge1: A' => B'
を渡すことを考える。
反変がある場合
trait Function1[-S, +T] { //関数の定義
def apply(x: S): T
}
A' => B'
を用いる場合、図より A => B
の挙動も保証される。
両方とも共変の場合
trait Function1[+S, +T] { // 本当は違う
def apply(x: S): T
}
この場合、AかつA'でない箇所が未定義
になるため、
A' => B'
を用いた時に関数 A=>B
の挙動を保証できない。