Covariant(共変)/Contravariant(反変)/Invariant(不変)について、自分用に走り書きした。 うまく説明できずにもにょったり、どれがどれだかわからなくなった時にこれを読みなおす。
記号
- 項tは型Tを持つ。
- 型Aは 型B の部分型である。もし項tがであるならば でもある。この場合B型の値が要求されているところで、代わりにA型の値を使っても問題ない。
定義
を型演算子とする。
- Opはcovariantである。
- を満たす任意の型A, Bに対して
- Opはcontravariantである。
- を満たす任意の型A, Bに対して
- Opはinvariantである。
- Opはcovariantでもcontravariantでもない。
- Opはbivariantである。
- Opはcovariantかつcontravariantである。
Covariant, Contravariantな型演算子の例
, かつ , とする。 型演算子, を次のように定義する。
このとき、 は CovariantであるがContravariantではなく、 は ContravariantだがCovariantではない。 すなわち、 とは言えるが、他は言えない。
例の例
関数 が
だとする。
このとき、
- OK
- だめ
- だめ
- OK
型の項が要求されている箇所にを渡したり、 型の項が要求されている箇所にを渡したりすることはできるが、 型の項が要求されている箇所にを渡したり、 型の項が要求されている箇所にを渡したりすることはできない。