通過單層繼承,我可以執行以下操作:
// Dog extends Animal
List<Dog> dogs = ...;
// Cat extends Animal
List<Cat> cats = ...;
List<? extends Animal> animals = new ArrayList<>();
animals.addAll(cats);
animals.addAll(dogs);
我可以在不強制轉換的情況下做到這一點,這很好。
但是,如果我有如下情況怎么辦?
// Plant extends LivingBeing
List<Plant> plants = ...;
// Animal extends LivingBeing
// Cat extends Animal
List<Cat> cats = ...;
List<? extends LivingBeing> livingThings = new ArrayList<>();
// This is fine
lvingThings.addAll(plants);
// FIXME: Fails because Cat doesn't directly extend LivingBeing
livingThings.addAll(cats);
有沒有辦法指定一個不是串列所有成員的直接父級的上限,這樣我就可以避免強制轉換?
uj5u.com熱心網友回復:
您的第一個示例無法編譯。兩者都是由? extends零件引起的。問題是一旦初始化完成,編譯器就已經忘記了實際的型別。這意味著在初始化之后livingThings,編譯器認為它可以是 aList<LivingBeing>或List<Animal>(List<Cat>所有這些都允許添加貓),但也可以List<Dog> or 是 List`,它不允許添加貓。
如果您想要一個包含任何型別生物的事物的串列,您必須將其宣告為:List<LivingBeing>. 否則你不能再添加任何東西,除了null.
后者Collection<? extends T>對于任何型別都是正確的T。對于任何匹配的型別,唯一安全的值? extends T是null.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465869.html
