ホームページ >Java >&#&チュートリアル >共分散、不変、反変はプログラミングにおける型の関係にどのような影響を与えるのでしょうか?

共分散、不変、反変はプログラミングにおける型の関係にどのような影響を与えるのでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-12 03:28:01297ブラウズ

How do Covariance, Invariance, and Contravariance Affect Type Relationships in Programming?

平易な英語での共分散、不変性、および反変性: 包括的な説明

共分散、不変性、および反変性は、タイプとサブタイプの間の関係は、タイプ変換の影響を受けます。これらの概念は、プログラミング言語におけるポリモーフィズムと型安全性を理解する上で重要な役割を果たします。

共分散

共分散は、サブタイプの関係が型変換によって保持されることを示します。つまり、型 A が型 B のサブタイプである場合、変換された型 f(A) も f(B) のサブタイプになります。たとえば、変換 f(A) = List を考えてみましょう。ここで、List は次のように宣言されています。は List のサブタイプであり、 f(String) = List となります。 f(Object) = List のサブタイプです。したがって、 f は共変です。

class List<T> { ... }

反変

反変は共分散の反対です。型変換によりサブタイプの関係が逆転することを示します。 A が B のサブタイプである場合、f(B) は f(A) のサブタイプです。たとえば、変換 f(A) = A[] を考えてみましょう。この変換により、配列間のサブタイプ関係が逆転します。つまり、Object[] は String[] のサブタイプですが、String[] は Object[] のサブタイプではありません。

不変

不変は、共分散も反変も成り立たないときに発生します。言い換えれば、サブタイプの関係は、型変換によって保持されたり逆転されたりしません。たとえば、変換 f(A) = Map を考えてみましょう。 A が B のサブタイプである場合、 f(A) = Map であるという保証はありません。 f(B) = Map のサブタイプです。したがって、 f は不変です。

言語機能のアプリケーション

  • 割り当て: Java のオブジェクト型は不変です。したがって、代入ステートメント ArrayList は次のようになります。文字列 = 新しい ArrayList();は無効ですが、Object[] オブジェクト = new String[1];は有効です。
  • メソッド呼び出し: メソッド呼び出しは、型チェックのサブタイプ関係に依存します。メソッド (ArrayList list) は、引数 new ArrayList() を使用して呼び出すことができますが、 new ArrayList() を使用して呼び出すことはできません。
  • メソッドのオーバーライド: オーバーライドする場合メソッドの場合、パラメーターの型は共変または不変である必要があり、戻り値の型は共変または不変である必要があります。不変。たとえば、次のコードは戻り値の型が共変であるため有効です。
  • class List<T> { ... }

    共変、不変、反変を理解することは、多態性演算の動作を理解し、プログラミングにおける型安全性を確保するために不可欠です。

    以上が共分散、不変、反変はプログラミングにおける型の関係にどのような影響を与えるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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