共変性と反変性 (計算機科学)
これはList<Animal>型の変数に、List<Cat>型のインスタンスを型安全に代入したい時などに使う。
反変(contravariant)は、要素型のサブタイプ関係を逆方向にしてコンテナに反映させる。List<Animal>はList<Cat>のサブタイプになるが、これは単に型安全でなくなるだけである。反変でのデータ要素は写像(第一級関数)にされることが多く、写像の定義域の型の反変がコンテナに反映される。特化された定義域の写像コンテナを、汎化された定義域の写像コンテナで置き換えたい時などに使う。
双変(bivariant)は、要素型のサブタイプ関係を双方向にしてコンテナに反映させる。反変と同様にそのデータ要素は写像にされることが多い。双変は例えば、特化された定義域の写像コンテナと、汎化された定義域の写像コンテナを相互に置き換え可能にしたい時などに使われ、その写像の値域は通常invariantなのでList<特化> ≡ List<汎化> になる。