难以理解Java中的通配符

时间:2014-03-12 17:48:51

标签: java generics wildcard

我很难理解Java泛型中的通配符。具体来说,我有以下问题:

  1. 如果我们有LinkedList<?>,为什么我们不能添加Object呢?我了解它并不知道列表的类型,但是在列表中添加Object是否可以在任何情况下覆盖我们?

  2. 与上述问题类似,如果我们有LinkedList<? extends Number>,为什么我们不能add Number呢?

  3. 最后,如果我们有LinkedList<? super Number>,为什么我们可以add Integer到列表,我们不应该只添加一些内容超类的数量?

  4. 我想我试图了解通配符的工作方式,我已经阅读了有关它们的Oracle教程以及其他一些内容,但我不明白为什么它们可以工作我想

1 个答案:

答案 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>