ホームページ >バックエンド開発 >C++ >オブジェクト指向プログラミングにおける共分散と反分散の違いは何ですか?

オブジェクト指向プログラミングにおける共分散と反分散の違いは何ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-20 17:12:10895ブラウズ

What is the Difference Between Covariance and Contravariance in Object-Oriented Programming?

共分散と反分散についての深い理解

オブジェクト指向プログラミングにおける共変性と反変性により、型の安全性を維持しながら、さまざまな状況で異なる型を置き換えることができます。

共分散

共分散は、出力位置で (戻り値などとして) 「スーパータイプ」 (より一般的) が「サブタイプ」 (より具体的) の代わりに使用される場合に適用されます。この場合、スーパータイプのリストをサブタイプのリストに割り当てることができます:

<code class="language-java">List<Fruit> fruits = new ArrayList<>();
List<Apple> apples = fruits; // 协变:List<Apple> 是 List<Fruit> 的子类型</code>

反変性

反変性は、入力位置で「サブタイプ」が「スーパータイプ」の置換として (たとえば、メソッド パラメーターとして) 使用される場合に適用されます。この場合、サブタイプを受け入れるラムダ式を、スーパータイプを期待するラムダ式に渡すことができます:

<code class="language-java">Comparator<Apple> compareApples = (a, b) -> a.compareTo(b);
Comparator<Fruit> compareFruits = compareApples; // 逆变:Comparator<Apple> 是 Comparator<Fruit> 的子类型</code>

「in」キーワードと「out」キーワード

ジェネリックの「in」および「out」キーワードは、ジェネリック パラメータの分散を指定するために使用されます。 「out」は共分散を意味し、「in」は反分散を意味します。

MyInterface インターフェースの例:

  • 共分散 (戻り値):
<code class="language-java">interface MyInterface<out T> {
    T get(); // T 可以是 T 的原始类型的任何子类型
}</code>
  • 反転 (入力パラメータ):
<code class="language-java">interface MyInterface<in T> {
    void set(T value); // T 必须是 T 的原始类型的子类型
}</code>

要約すると、共分散と反分散により、ジェネリック型の使用目的に基づいて安全な型置換が可能になり、コード設計の柔軟性を提供しながら型の安全性が確保されます。

以上がオブジェクト指向プログラミングにおける共分散と反分散の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。