为啥我不能在编译时将整数添加到泛型集合中,即使使用引用类型作为数字创建的泛型? [复制]

Posted

技术标签:

【中文标题】为啥我不能在编译时将整数添加到泛型集合中,即使使用引用类型作为数字创建的泛型? [复制]【英文标题】:Why i cant add Integer into generic collection at compile time itself eventhough the generics created with reference type as Number? [duplicate]为什么我不能在编译时将整数添加到泛型集合中,即使使用引用类型作为数字创建的泛型? [复制] 【发布时间】:2018-12-08 16:03:31 【问题描述】:
List<? super Integer> integers = new ArrayList<Number>();
List<? extends Number> integers2 = new ArrayList<Number>();
integers.add( new Integer(4));
integers2.add(new Integer(4));

我在最后一行遇到编译器错误,我可以知道为什么吗?即使 Integer 确实扩展了 Number 我得到以下错误

The method add(capture#3-of ? extends Number) in the type List<capture#3-of ? extends 
 Number> is not applicable for the arguments (Integer)

【问题讨论】:

也很有趣***.com/questions/2745265/… 【参考方案1】:

因为List&lt;? extends Number&gt; 不是List&lt;Number&gt;

List&lt;? extends Number&gt; 可以是,例如,List&lt;Double&gt;List&lt;Float&gt;

List<? extends Number> integers2 = new ArrayList<Double>(); //valid

将整数添加到双精度列表中是无效的,这就是编译器阻止您这样做的原因。

在这种情况下,您可能不应该使用通配符 (?)。

【讨论】:

我完全明白了,但为什么它在编译时抛出错误,它也可以是一个整数正确 这个问题已经被问过很多次了。这里通常的做法是关闭重复而不是增加信息碎片 @TimCastelijns 确实如此。我不知道为什么我直接进入自动应答模式。因为我有金徽章欺骗关闭特权,所以我把它做成了一个社区 wiki,所以我不会因为不再对新答案开放的问题而得到不公平的代表 @amarnathharish Java 就是将问题检测推到编译时间。泛型是一个安全的特性,引入它是为了将相关的错误检测转移到编译时。 Java 不会等待实际类型在运行时出现,它会检测到这可能会导致错误并引发编译时错误。如果你想要一个接受所有数字的List,那么写List&lt;Number&gt;。需要注意的是,? extends Number并不意味着所有扩展都是有效的并且可以混合。它仍被锁定为由调用者定义的一种显式类型。

以上是关于为啥我不能在编译时将整数添加到泛型集合中,即使使用引用类型作为数字创建的泛型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin:从泛型集合到泛型数组

java 泛型 增强for循环

将元素添加到泛型列表

Java基础:泛型

Java基础系列--08_集合1

java5核心基础之泛型-泛型作用于编译阶段-怎样将String对象传入Integer类型的泛型对象中?