无法使用通配符泛型类型向 Java 集合添加值
为什么这段代码不编译(是一个接口)?Parent
List<? extends Parent> list = ...
Parent p = factory.get(); // returns concrete implementation
list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)
为什么这段代码不编译(是一个接口)?Parent
List<? extends Parent> list = ...
Parent p = factory.get(); // returns concrete implementation
list.set(0, p); // fails here: set(int, ? extends Parent) cannot be applied to (int, Parent)
它这样做是为了安全。想象一下,如果它有效:
List<Child> childList = new ArrayList<Child>();
childList.add(new Child());
List<? extends Parent> parentList = childList;
parentList.set(0, new Parent());
Child child = childList.get(0); // No! It's not a child! Type safety is broken...
的含义是“是某种类型的列表,它扩展了。我们不知道是哪种类型 - 它可能是 a、 a 或 a 。这使得从API中提取任何项目并从转换为是安全的,但是调用API转换为...因为该转换可能无效。List<? extends Parent>
Parent
List<Parent>
List<Child>
List<GrandChild>
List<T>
T
Parent
List<T>
Parent
T
List<? super Parent>
PECS - “生产者 - 扩展,消费者 - 超级”。您是对象的消费者。List
Parent