- Covariance and contravariance (computer science)
- Many programming language type systems support subtyping. For instance, if the type Cat is a subtype of Animal, then an expression of type Cat should be substitutable wherever an expression of type Animal is used.
この内容は、コンパイラ開発者であるか、
コンパイラのAPIを使用するか、
あるいはコンパイラの型システムを過度に使用する際に
自然と出会う内容です。
そして、私たちのコーディング生活の中で自然と溶け込んでいます。
簡単に言うと、AnimalとDogという2つの型があるとき、
AnimalにDogが代入される場合、それは共変性です。
逆にDogにAnimalが代入される場合、それは反共変性です。
一般的には、DogにAnimalを代入することはできません。
なぜなら、それは一般的な人の視点からは妥当ではなく、
そのため、コンパイラ開発者はそれを意識して、一部の部分のみに反共変性を導入するのです。
通常、上記のように関数の入力値に対して反共変性を適用し、出力値に対しては共変性を維持します。
なぜこの反共変性が必要なのかと考えるかもしれません。
これは、イベントハンドリングなどの場面で、より柔軟で多型的な処理を可能にします。
むしろ、共変性の場合には問題が発生することがあります。
上記のコードでは、Dogが入るべき場所にAnimalを挿入することで柔軟性を確保し、多型性を考慮できるようにしています。
逆に、Animalの代わりにDogのサブタイプであるChiwawaなどが挿入された場合、イベントハンドラーを実行する際に、Dogには存在しないChiwawa固有のインターフェースが原因でエラーが発生するでしょう。
むしろ、その関数を呼び出す際にAnimalを型として使用するので、実行時にはAnimalのサブタイプを自由に挿入できるため、
AnimalにDogが代入されているように見えるかもしれません。
このように、通常反共変性は入力値に主に使用されます。
不変性、変性
簡単に言うと、変性とは共変性と反共変性の両方が可能であり、不変性とはどちらも不可能な状態です。
まとめとして
この内容は、単純な場合もあれば複雑な場合もあるため、
このような資料を直接読んでみるのも良いかもしれません。
コメント0