java - 泛型的协方差

标签 java generics

Possible Duplicate:
what is the difference between 'super' and 'extends' in Java Generics
Java Generics WildCard Question: List<? extends A>

我发现了 Java 泛型的一种奇怪行为,我无法向自己解释。

如果我尝试以下代码,我希望它能够工作

List<? extends Number> list = new ArrayList<>();
list.add(new Integer(2));
list.add(new Float(2.0f));

但这会导致编译器错误。

如果我将第一行更改为

List<? super Number> list = new ArrayList<>();

它对于编译器来说工作得很好。

谁能给我解释一下吗? 和 有什么不一样?扩展? super

最佳答案

参见《Effective Java》第二版,第 28 条:

生产者扩展,消费者 super

如果你的参数是生产者,它应该是 <? extends T> ,如果是消费者,则必须是 <? super T>

这里是消费者,所以它一定是 <? super Number>

关于java - 泛型的协方差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12794440/

相关文章:

java - java中的classloader本身就是一个类那么谁来加载classloader类呢?

swift - nil 不能转换为 hashable。

templates - 如何在 Rust 中使用数值作为泛型参数?

generics - Swift 闭包中保留内存的生命周期

java - 免费定位服务 - 按名称街道

java - 使用带有 Android 额外 header 的 URL 打开浏览器

java - Java中的可序列化和可外部化有什么区别?

java - 用于 selenium webdriver (java) 的 Eclipse 或 intelliJ IDEA?

java - 代码模型 : generic types generation in a loop . 窄()?

Java toString 问题