Sunrabbit

共変性と反共変性

作成: 2024-11-01

作成: 2024-11-01 01:06

この内容は、コンパイラ開発者であるか、
コンパイラのAPIを使用するか、
あるいはコンパイラの型システムを過度に使用する際に

自然と出会う内容です。


そして、私たちのコーディング生活の中で自然と溶け込んでいます。


簡単に言うと、AnimalとDogという2つの型があるとき、

AnimalにDogが代入される場合、それは共変性です。

逆にDogにAnimalが代入される場合、それは反共変性です。

一般的には、DogにAnimalを代入することはできません。

なぜなら、それは一般的な人の視点からは妥当ではなく、
そのため、コンパイラ開発者はそれを意識して、一部の部分のみに反共変性を導入するのです。


通常、上記のように関数の入力値に対して反共変性を適用し、出力値に対しては共変性を維持します。


なぜこの反共変性が必要なのかと考えるかもしれません。

これは、イベントハンドリングなどの場面で、より柔軟で多型的な処理を可能にします。

むしろ、共変性の場合には問題が発生することがあります。


上記のコードでは、Dogが入るべき場所にAnimalを挿入することで柔軟性を確保し、多型性を考慮できるようにしています。

逆に、Animalの代わりにDogのサブタイプであるChiwawaなどが挿入された場合、イベントハンドラーを実行する際に、Dogには存在しないChiwawa固有のインターフェースが原因でエラーが発生するでしょう。


むしろ、その関数を呼び出す際にAnimalを型として使用するので、実行時にはAnimalのサブタイプを自由に挿入できるため、

AnimalにDogが代入されているように見えるかもしれません。


このように、通常反共変性は入力値に主に使用されます。


不変性、変性


簡単に言うと、変性とは共変性と反共変性の両方が可能であり、不変性とはどちらも不可能な状態です。

まとめとして

この内容は、単純な場合もあれば複雑な場合もあるため、

このような資料を直接読んでみるのも良いかもしれません。




コメント0