質問

私はこれを把握しようと苦労しています。私は次のコードがあるとします:

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()方法は、それが割り当て可能でなければなりませんので、必ずlistオブジェクトが含まれますMammalを返します。私は何をしないのですか?

役に立ちましたか?

解決

getMammalsList<Giraffe>を返すことができ、そしてそれはList<Mammal>に変換したならば、あなたはそれにZebraを追加することができると思いますので。あなたは、Zebraのリストに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

他のヒント

まあ、それは残念ながらそのように動作しません。

あなたがgetMammalsを宣言するときは、

()List<? extends Mammal>を返すために、それはList<Mammal>またはList<Giraffe>を返しますがList<Animal>ことができないことを意味します。

Yoursをメイン()は次のようになります:

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

EDIT:共分散に関しては、それはそれで、通常は意味しているものです。

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;}
}
あなたが見ることができるように

それはあなたがメソッドをオーバーライドする際のメソッドの戻り値の型をオーバーロードすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top