让我们改变类的类型,使其更易于理解。 您的第一个示例已更改为 数字
Collection<? extends Number> c = new ArrayList<Number>();
意味着有 ?
个类型为 Number
的对象。因此,它可以是任何 extends Number
的东西,例如 Integer
、Double
、Float
、BigInteger
等等。因此,您无法保证列表中驻留的是哪种类型的 Number
对象。
List<Integer> // only allows Integer
List<Double> // only allows Double
List<Float> // only allows Float
这就是为什么你不能向<? extends Number>
添加任何内容,因为它可能是上述列表中的任何一个。
另一种方式是使用<? super Number>
。这意味着列表中的每个对象都是Number
的祖先。在这种情况下,您可以添加来自Number
的超类型/类型的任何内容。使用? super Number
可以保证其中的所有内容都是Number
。
但是,您无法保证实际类型,例如:
list.get(0); // is a Number, but could be a Integer
list.get(1); // is a Number, but could be a Float
list.get(2); // is a Number, but could be a Double
简而言之,使用extends
进行读取,使用super
进行添加。
这里有一张来自文档https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html的图表。
![enter image description here](https://istack.dev59.com/UDhhM.gif)
这里是Jon Skeet对于<? super Number>
的解释
https://dev59.com/413Ua4cB1Zd3GeqP9RrJ#8083260