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

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

Barbara Streisand
リリース: 2024-11-12 03:28:01
オリジナル
324 人が閲覧しました

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 は不変です。

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