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

标签 java generics

为什么这段代码不编译(Parent 是一个接口(interface))?

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...

List<? extends Parent>的含义是“这是扩展 Parent 的某种类型的列表。我们不知道是哪种类型 - 它可能是 List<Parent>List<Child>List<GrandChild>。”这使得从 List<T> 中提取任何项目 变得安全API 并从 T 转换至 Parent , 但是调用 inList<T> 是不安全的API 从 Parent 转换而来至 T ...因为该转换可能无效。

关于java - 无法使用通配符泛型向 Java 集合添加值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28833112/

相关文章:

java - 计算文件的字数并将其存储在数组中?

java - Spring 登录页面可以工作,但我的登录页面不行?

c# - 何时使用非泛型接口(interface)作为泛型类型约束

java - 为什么我们可以使用具有泛型引用的数组

java - Hibernate 中的 Multi-Tenancy - 多数据库 (SQLite)

java - JEdi​​torPane 是最后一行

java - ArrayList 中的数组问题,Java

generics - Dart:需要实现运算符 [] 的通用约束

c# - 使用 LINQ 进行快速排序

c# - 将字符串转换为十进制? (可为空的十进制)通过扩展方法