Javaジェネリック共変性 質問する

Javaジェネリック共変性 質問する

以下の記事を理解するのに苦労しています:http://www.ibm.com/developerworks/java/library/j-jtp01255.html

下、

ジェネリックは共変ではない

著者は述べている。

ln はリストなので、これに Float を追加することは完全に合法のようです。しかし、ln が li でエイリアス化されると、li の定義に暗黙的に含まれている型安全性の約束 (li は整数のリストであり、これがジェネリック型が共変でない理由) に違反することになります。

「ln が li でエイリアス化されている場合」という部分が理解できません。著者はエイリアスとは何を意味しているのでしょうか?(参照?)。引用された行の上のコード スニペットは、Java で何が違法であるかを説明しているようで、なぜ違法であるかを説明しているようには見えません。誰かが例を挙げて説明してくれると非常に助かります。よろしくお願いします。

ベストアンサー1

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

Java では、 Integer は Number から継承されるため(java.lang.Number)、直感的には、 Integer であるものはすべて(java.lang.Integer)数値でもありますが、この記事で指摘されているのは、ジェネリックではそのようには機能しないということです。その例を考慮すると、 float (これは Number です) を に格納することになりList<Integer>、 float は整数ではないため、これは違法です。

結論:ジェネリックは共変ではありません。

注記:ぜひ読んでみてくださいEffective Java (第 2 版) 第 5 章: ジェネリック。

おすすめ記事