サブクラス関係におけるcovariantとcontravariant
- 型チェックするシステムは基本的には、きっちりあった型での整合性でチェックを行う
- Cとかではshort値はint変数に無条件で代入可能、オブジェクト指向では子クラス型オブジェクトは、親クラス型変数として無条件で扱える、ということを許すというのは、型の「variance」を許す型システム、ということ。
- サブクラス関係をメソッドごとに見る場合を考えると、以下の条件であれば無条件に扱うことができる
- 子クラスのメソッドの引数は、親クラスの引数より「広い範囲」を取れる
- 子クラスのメソッドの戻り値は、親クラスの戻り値より「狭い範囲」を取れる
- これを型で考えると、子クラスのメソッドは、
- 引数の型: 親クラスメソッドの引数型の任意の親クラス型であればよい
- 戻り値の型: 親クラスメソッドの戻り値型の任意の子クラス型であればよい
- つまりサブクラス関係におけるメソッドを無条件に処理できるためには以下は満たしている必要がある:
- 引数は"contra"variant: メソッドをもつオブジェクト集団は狭まるのにつれ、引数がとりうる範囲は「逆に」広がってゆく
- 戻り値は"co"variant: メソッドをもつオブジェクト集団が狭まるのにつれ、戻りのとりうる範囲も「同じく」狭まってゆく