[英]Java Generics - Upper Bounds through layers of inheritance
使用单层 inheritance 我可以这样做:
// 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);
有没有办法指定一个上限,该上限不是列表所有成员的直接父级,这样我就可以避免强制转换?
您的第一个示例无法编译。 两者都是由? extends
? extends
部分。 问题是一旦初始化完成,编译器就已经忘记了实际类型。 这意味着在初始化livingThings
之后,编译器认为它可以是List<LivingBeing>
、 List<Animal>
或List<Cat>
(所有这些都允许添加猫),但也可以是List<Dog> or
List`,它们不'允许猫。
如果你想要一个包含任何类型生物的列表,你必须这样声明它: List<LivingBeing>
。 否则除了null
之外你不能再添加任何东西。
后者对任何Collection<? extends T>
Collection<? extends T>
为任何类型T
。 对于匹配的任何类型都是安全的唯一值? extends T
? extends T
是null
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.