1

私は次のクラスを持っています

public class Animal


public class Dog extends Animal


public class Cat extends Animal

そしてテストのために、私はドライバークラスを持っています。

public class Driver {
    public static void main(String[] args){
        List<? extends Animal> animalList = Arrays.<Dog>asList(new Dog(), new Dog(), new Dog());
        animalList.add(new Dog()) // Compilation error 
    }               
}

デフォルトではリストは不変型コンテナです。たとえばList<Object> objectListArrayList<String> stringListstringList を objList に置き換えることはできません。これはコンパイルエラーを引き起こします

私の試みは、Driver クラスのようにリストを共変にすることです。

に従って、<? extends Animal>Animal タイプを含む Animal のサブタイプである任意のオブジェクトを適用できます。

しかし、指定された行でコンパイルの問題が発生しています。誰かが私が間違った場所を理論的に説明できますか.

4

3 に答える 3

4

一般的なワイルドカード ( ) を誤解していると思います?件名に関するJavaチュートリアルから:

いつものように、ワイルドカードを柔軟に使用するには代償が伴います。その代償は、メソッドの本体で形状に書き込むことが現在違法であるということです。たとえば、これは許可されていません。

public void addRectangle(List<? extends Shape> shapes) {
    // Compile-time error!
    shapes.add(0, new Rectangle());
}

上記のコードが許可されていない理由を理解できるはずです。の 2 番目のパラメータのタイプshapes.add()? extends Shape-- の未知のサブタイプですShape。型がわからないので、Rectangle;のスーパータイプかどうかもわかりません。そのようなスーパータイプである場合とそうでない場合があるため、Rectangleそこに a を渡すのは安全ではありません。

Java ジェネリック コレクションは共変ではありません。説明については、例えばJava の理論と実践: Generics gotchasを参照してください。

于 2012-07-14T14:07:09.907 に答える
1

Java には非常に強力な型システムがありません。つまり、これを行うことはできません。

悲しい答えですが、本当です。ウィキペディアから:

配列とは異なり、ジェネリック クラスは共変でも反変でもありません。たとえば、どちらList<String>List<Object>他方のサブタイプではありません

http://en.wikipedia.org/wiki/Covariance_and_contravariance_(computer_science)#Java

于 2012-07-14T14:07:26.983 に答える
0

コードを次のように変更します。

public class Driver {
    public static void main(String[] args){
        List<? extends Animal> animalList = Arrays.<Cat>asList(new Cat(), new Cat(), new Cat());
        animalList.add(new Dog()) // Compilation error 
    }               
}

コンパイルエラーはもっと理にかなっていますよね?Java が終了しなければならないのは、あなたがそれを与えた型だけですanimalList。Java は、右側にあるものがCatオブジェクトのリストである可能性があることを認識しているため、Dog. コードを次のように変更します

List<Animal> animalList = Arrays.<Animal>asList(new Dog(), new Dog(), new Dog());

これで問題なく動作します。

于 2012-07-14T14:19:12.083 に答える