java - 为什么不能在上限泛型列表中添加元素?

标签 java generics

我有一个包含上限泛型的列表。

 List<? extends Number> l = new ArrayList<>();
 l.add(new Integer(3));  //ERROR
 l.add(new Double(3.3)); // ERROR

我不明白这个问题,因为 Integer 和 Double 扩展了 Number。

最佳答案

List<? extends Number>并不意味着“一个可以包含 Number 子类的所有对象的列表”,它意味着“一个参数化为一个扩展 Number 的具体类的列表”。这不是您定义的列表本身的内容,而是分配给变量的实际列表对象的参数化类型可以是什么(男孩,这比理解更难解释:))

所以,你可以这样做:

List<? extends Number> l = new ArrayList<Integer>();
List<? extends Number> l = new ArrayList<Double>();

如果您想要一个能够容纳 Number 类或其子类的任何对象的列表,只需这样做:

List<Number> l = new ArrayList<>();

l.add(new Integer(33));
l.add(new Double(33.3d));

(插入值的装箱是不必要的,但为了清楚起见..)

关于java - 为什么不能在上限泛型列表中添加元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21383139/

相关文章:

Java 通用类的可分配性

java - 使用 intellij 将图像导出为 jar 文件

java - 难道不能保证从列表派生的并行流总是表现得像它的顺序对应物一样,提供相同的、可预测的输出吗?

java - 比较两个字符串数组,分别返回匹配的字符串和不匹配的字符串

c# - 在运行时指定通用委托(delegate)类型参数

C# 传递强类型属性名称列表

java - 如何在 Android 中从 DialogFragment 获取数据到 MainActivity?

java - 连续因素检验

swift - 为所有 rest api 服务声明一个通用函数

java - 通用接口(interface)有好处吗?