7

私はこれを理解するのに苦労しています。次のコードがあるとします。

class Animal { }
class Mammal extends Animal { }
class Giraffe extends Mammal { }
...
public static List<? extends Mammal> getMammals() { return ...; }
...

public static void main(String[] args) {
    List<Mammal> mammals = getMammals(); // compilation error
}

割り当てによってコンパイル エラーが発生するのはなぜですか? エラーは次のようなものです。

Type mismatch: cannot convert from List<capture#4-of ? extends Mammal> to List<Mammal>

共分散に関する私の理解によれば、メソッドは常にオブジェクトを含むgetMammals()a を返すため、割り当て可能である必要があります。私は何が欠けていますか?listMammal

4

2 に答える 2

19

getMammalsを返すことができるためList<Giraffe>、それが に変換可能であれば、List<Mammal>それに a を追加することができますZebraZebraのリストにを追加することはできませんGiraffeよね?

class Zebra extends Mammal { }

List<Giraffe> giraffes = new List<Giraffe>();

List<Mammal> mammals = giraffes; // not allowed

mammals.add(new Zebra()); // would add a Zebra to a list of Giraffes
于 2009-07-26T11:26:02.547 に答える
6

残念ながら、そのようには機能しません。

getMammals() を返すと宣言するList<? extends Mammal>と、それは返すことができるList<Mammal>か、返さList<Giraffe>ないことを意味しますList<Animal>

あなたの main() は次のようになります。

public static void main(String[] args) {
    List<? extends Mammal> mammals = getMammals();
    Mammal mammal = mammals.get(0);
}

編集:共分散に関して、それは通常それが意味するものです:

class Animal {
    public Animal getAnimal() {return this;}
}

class Mammal extends Animal {
    public Mammal getAnimal() {return this;}
}

class Giraffe extends Mammal {
    public Giraffe getAnimal() {return this;}
}

ご覧のとおり、メソッドをオーバーライドするときに、メソッドの戻り値の型をオーバーロードできます。

于 2009-07-26T11:27:04.103 に答える