23

次の記事を理解するのに問題があります: http ://www.ibm.com/developerworks/java/library/j-jtp01255.html

下、

ジェネリックは共変ではありません

著者は次のように述べています。

lnはリストであるため、それにFloatを追加することは完全に合法のようです。しかし、lnがliでエイリアス化されている場合、liの定義に暗黙的に含まれている型安全性の約束が破られます。これは整数のリストであるため、ジェネリック型を共変にすることはできません。

「lnがliでエイリアスされた場合」と書かれている部分がわかりません。作者はエイリアスとはどういう意味ですか?(参照?)。引用された行の上のコードスニペットは、Javaで何が違法であり、なぜではないかを示しているようです。誰かが例を挙げて説明できれば、私にとって非常に役に立ちます。前もって感謝します。

4

3 に答える 3

50
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 は整数List<Integer>ではないため、これは不正です。

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

注: Effective Java (2nd Edition) Chapter 5: Genericsを読むことをお勧めします。

于 2010-04-18T02:17:24.780 に答える
10

あなたがこのようなことをすることができれば:

List<Float> foo;
List<Object> bar;

foo = new ArrayList<Float>();
bar = foo;

foo.add(1.0f);
bar.add("Hello");

物事は非常にうまくいかないでしょう。この例では、barはfooのエイリアスであり、それができれば、ジェネリックスが存在する主な理由である型安全性が失われます。

于 2010-04-18T02:15:57.910 に答える
-2
public class vechicle {
void drive(){
}
}
class car extends vechicle{
        //Covariance
    vechicle getObject(){
        return new car();
    }
        //contravariance
    car getmyObject(){
        return (car) new vechicle(); 
    }
}
于 2014-03-05T04:39:47.587 に答える