为啥我不能在编译时将整数添加到泛型集合中,即使使用引用类型作为数字创建的泛型? [复制]
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<? extends Number>
不是List<Number>
。
List<? extends Number>
可以是,例如,List<Double>
或 List<Float>
:
List<? extends Number> integers2 = new ArrayList<Double>(); //valid
将整数添加到双精度列表中是无效的,这就是编译器阻止您这样做的原因。
在这种情况下,您可能不应该使用通配符 (?
)。
【讨论】:
我完全明白了,但为什么它在编译时抛出错误,它也可以是一个整数正确 这个问题已经被问过很多次了。这里通常的做法是关闭重复而不是增加信息碎片 @TimCastelijns 确实如此。我不知道为什么我直接进入自动应答模式。因为我有金徽章欺骗关闭特权,所以我把它做成了一个社区 wiki,所以我不会因为不再对新答案开放的问题而得到不公平的代表 @amarnathharish Java 就是将问题检测推到编译时间。泛型是一个安全的特性,引入它是为了将相关的错误检测转移到编译时。 Java 不会等待实际类型在运行时出现,它会检测到这可能会导致错误并引发编译时错误。如果你想要一个接受所有数字的List
,那么写List<Number>
。需要注意的是,? extends Number
并不意味着所有扩展都是有效的并且可以混合。它仍被锁定为由调用者定义的一种显式类型。以上是关于为啥我不能在编译时将整数添加到泛型集合中,即使使用引用类型作为数字创建的泛型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章