我很难理解Java泛型中的通配符。具体来说,我有以下问题:
如果我们有LinkedList<?>
,为什么我们不能添加Object
呢?我了解它并不知道列表的类型,但是在列表中添加Object
是否可以在任何情况下覆盖我们?
与上述问题类似,如果我们有LinkedList<? extends Number>
,为什么我们不能add
Number
呢?
最后,如果我们有LinkedList<? super Number>
,为什么我们可以add
Integer
到列表,我们不应该只添加一些内容超类的数量?
我想我试图了解通配符的工作方式,我已经阅读了有关它们的Oracle教程以及其他一些内容,但我不明白为什么它们可以工作我想
答案 0 :(得分:5)
你会混淆对象和类型
与简单的通用参数不同,通配符描述泛型参数的类型
List<? super Number>
不是Number
的超类列表;它是一个未知类型的列表,其中该类型是数字的超类。
LinkedList<?>
可能是LinkedList<Car>
由于Object
不是Car
,因此您无法向其添加Object
。
事实上,由于您不知道任何关于列表包含的类型,因此您无法向其添加任何内容。 (null
除外)
同样,LinkedList<? extends Number>
可能是List<Long>
,因此您无法为其添加Integer
。 (因为Integer
不是Long
)
另一方面,List<? super Number>
绝对允许包含Number
或任何派生类,因为它只能是Number
个超类之一的列表(例如, List<Object>
)