0

可能重复:
Java 泛型中的“超级”和“扩展”有什么区别
Java 泛型通配符问题:List<? 扩展 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<>();

它适用于编译器。

谁能给我解释一下?和有什么区别?扩展?超级

4

1 回答 1

1

请参阅 Effective Java 第 2 版,第 28 条:

生产者扩展,消费者超级

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

这里是消费者,所以它必须是<? super Number>

于 2012-10-09T07:06:04.400 回答