ホームページ  >  記事  >  Java  >  Java ジェネリックが共変ではないのはなぜですか?

Java ジェネリックが共変ではないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-21 04:19:10839ブラウズ

Why Aren't Java Generics Covariant?

Java ジェネリックスの共分散

提供された記事で説明されているように、Java ではジェネリックスは共変ではありません。これは、クラスがジェネリック クラスを拡張する場合、子クラスのジェネリック型を親クラスのジェネリック型のサブタイプにすることはできないことを意味します。

「エイリアス」の概念について

著者は、「ln が li でエイリアス化された場合」、型安全性の約束に違反すると述べています。エイリアスは、オブジェクトの代替名または参照を指します。このシナリオでは、li は ln のエイリアスです。

例示的な例

次のコードを考えてみましょう。

List<Integer> li = new ArrayList<Integer>();
List<Number> ln = li; // illegal
ln.add(new Float(3.1415));

Integer は次から継承します。いいえ、Float オブジェクトを ln に追加することは不正です。これは、li を ln にエイリアスすることによって、基本的に li は数値を保持できると言っているためです。ただし、li は当初、整数のみを保持すると宣言されていました。したがって、Float を ln に追加すると、li の型安全性の保証に違反します。

結論

この例は、Java ではジェネリックが共変ではないことを示しています。サブクラスのジェネリック型をスーパークラスのジェネリック型に割り当てようとすると、コンパイル時エラーが発生します。

以上がJava ジェネリックが共変ではないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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