泛型的协方差

时间:2012-10-09 06:57:50

标签: java generics

  

可能重复:
  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<>();

它适用于编译器。

任何人都可以向我解释一下吗? 有什么区别?延伸?超级

1 个答案:

答案 0 :(得分:1)

参见Effective Java 2nd Edition,Item 28:

Producer extends,Consumer super

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

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