无法使用通配符泛型类型向 Java 集合添加值

2022-09-01 13:47:19

为什么这段代码不编译(是一个接口)?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)

答案 1

它这样做是为了安全。想象一下,如果它有效:

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>ParentList<Parent>List<Child>List<GrandChild>List<T>TParentList<T>ParentT


答案 2
List<? super Parent>

PECS - “生产者 - 扩展,消费者 - 超级”。您是对象的消费者。ListParent


推荐