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 の挙動を保証できない。

