ホームページ  >  記事  >  Java  >  Java の共変性、不変性、反変性: 違いは何ですか? なぜ気にする必要があるのですか?

Java の共変性、不変性、反変性: 違いは何ですか? なぜ気にする必要があるのですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-12 01:38:02307ブラウズ

Covariance, Invariance, and Contravariance in Java: What's the Difference and Why Should I Care?

わかりやすい英語で説明された共分散、不変性、反変性

はじめに:
共分散、不変性、反変性は難しい場合がありますが、Java の型変換と関係を理解するためには不可欠です。この記事は、これらの概念を簡略化し、理解を深めるために実際の例を提供することを目的としています。

共分散:
共分散は、サブタイプ関係が保持される型変換について説明します。型 A が型 B のサブタイプである場合、変換 f(A) の結果、f(B) は f(A) のサブタイプになります。

例:
変換 f(List) = List を考えてみましょう。 List 以来は List のスーパータイプであり、次に List> です。 List> のスーパータイプです。これは共分散を示しています。

不変性:
不変性は、サブタイプの関係が型変換の影響を受けない場合に発生します。 A が B のサブタイプである場合、f(A) は f(B) のサブタイプまたはスーパータイプにはなりません。

例:
Java ジェネリックスは不変方式で動作します。 。たとえば、f(ArrayList
) = ArrayList。 ArrayList 以来および ArrayList

反変性:
反変性は共分散の逆です。サブタイプの関係は変換中に逆転します。 A が B のサブタイプの場合、f(B) は f(A) のサブタイプになります。

例:
型変換 f(A[]) を考えてみましょう。 = B[]。 Java では、配列は共変です。つまり、A[] が B[] のサブタイプである場合、 f(A[]) = B[] も f(B[]) = B[] のサブタイプになります。

アプリケーション:
Java では共変性、不変性、反変性が重要な役割を果たします:

  • 代入: 互換性のあるオブジェクトのみタイプを相互に割り当てることができます。コンパイラは、ソース型がターゲット型のサブタイプであるかどうかを確認します。
  • メソッド呼び出し: メソッドを呼び出すとき、実際のパラメータは、宣言されたパラメータ型のサブタイプである必要があります。メソッドの戻り値の型は、予期される戻り値の型のスーパータイプである必要があります。
  • オーバーライド: Java では、オーバーライドされたメソッドのパラメーターと戻り値の型は、元のメソッドの型と一致するか、一致する必要があります。

以上がJava の共変性、不変性、反変性: 違いは何ですか? なぜ気にする必要があるのですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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