【问题标题】:Difficulty Understanding Wildcards in JavaJava 中的通配符难以理解
【发布时间】:2014-03-12 17:48:51
【问题描述】:

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

  1. 如果我们有一个LinkedList<?>,为什么我们不能添加一个Object呢?我知道它不知道列表的类型,但是在任何情况下都不会在列表中添加Object 吗?

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

  3. 1234563

我想我想了解通配符的一般工作原理,我已经阅读了有关通配符的 Oracle 教程以及其他一些内容,但我不明白它们为什么会起作用。

【问题讨论】:

  • List> 表示列表可能包含任何内容,但所有这些内容都属于同一类型。由于您不知道它们是什么,因此无法添加。
  • 出于某种原因,我在考虑 UNIX shell 通配符。

标签: java generics wildcard


【解决方案1】:

您混淆了对象和类型。
与简单的泛型参数不同,通配符描述了泛型参数的类型
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>

【讨论】:

  • 感谢您的回答,这对我来说更有意义,但我仍然想了解为什么当我们向List<? super Number>,它是否将其视为Object
  • 它不会“把它当作”任何东西。不管Number的超类是什么,列表实际上是of,它当然可以容纳一个Number
  • 好的,但是如果你 addIntegerList<? super Number>,那不是 Number 的超类,那么你怎么能添加它,或者我错过了什么?
  • 你还在混淆对象和类型。你知道它是某种类型的List,它是Number 的超类。不管那个类型是什么,它都可以持有Integer
猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多