質問
私はこれを把握しようと苦労しています。私は次のコードがあるとします:
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
を返します。私は何をしないのですか?
解決
getMammals
はList<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;}
}
あなたが見ることができるようにそれはあなたがメソッドをオーバーライドする際のメソッドの戻り値の型をオーバーロードすることができます。
所属していません StackOverflow