型の入出力規格の互換性

型の制限の強弱

「強い・弱い」、「狭める・広げる」等が使われる。
以下の3つのクラスをもとに、型の制限の強弱を考える。

class A {}
class B : A {}
class C : B {}

それぞれを別ファイルにあると考えると分かりやすい。

  • AはBの存在もCの存在も知らない。
  • BはAの存在を知っているが、Cの存在は知らない。
  • CはAの存在もBの存在も知っている。

このため、以下のような代入が結果となる。

B a = new A(); // NG(Bは知らないので、AがBのように振舞えない)
C a = new A(); // NG(Cも知らないので、AはCのように振舞えない)
A b = new B(); // OK(Aを知っているので、BはAのように振舞える)
C b = new B(); // NG(Cを知らないので、BはCのように振舞えない)
A c = new C(); // OK(Aを知っているので、CはAのように振舞える)
B c = new C(); // OK(Bを知っているので、CはBのように振舞える)

以上のことを考えると

  • Aに対してBやCは型の制限が強い
  • Cに対してAやBは型の制限が弱い

共変性(Covariance)

最初に指定された型よりも強い派生型を使用できるようにする。
派生型を返す処理も扱えるようにする。

反変性(Contravariance)

最初に指定された型よりも一般的(弱い派生)型を使用できるようにする。
基底型を受け取る処理も扱えるようにする。

不変性(Invariance)

最初に指定された型のみを使用できるようにする。