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 サイトの他の関連記事を参照してください。