我知道 ArrayList<T>
用于什么,但何时应该使用 ArrayList<?>
?你能举例说明吗?谢谢。
我知道 ArrayList<T>
用于什么,但何时应该使用 ArrayList<?>
?你能举例说明吗?谢谢。
ArrayList<?>
基本上告诉编译器:
是的,我知道有一个泛型版本的ArrayList可供使用,但是我真的不知道这个ArrayList中会有什么类型的对象。所以不要警告我没有正确地使用泛型。
我刚刚了解到使用原始类型(ArrayList
)和带通配符的泛型(ArrayList<?>
)之间确实存在着真正的区别,这不仅仅是为了避免编译器警告。显然,一旦将某个东西声明为原始类型,任何方法都无法在该类型上使用泛型,即使泛型并不是基于您省略的类型。 点击此处查看示例
因此,尽管我的最初答案大体上是正确的,但我认为提到使用 ArrayList<?>
而不是 ArrayList
更重要的是,这不仅仅是消除编译器警告的问题。
ArrayList<?>
翻译:原始类型和带有通配符参数的类型之间存在更多差异。例如,您可以向原始ArrayList添加对象,但无法向 ArrayList<?>
添加。 - newacctnew ArrayList <?>()
,所以也许Groovy有点不同。 - newaccthttp://download.oracle.com/javase/tutorial/java/generics/wildcards.html
注意:使用 super 关键字可以指定下限。因此,
<? super Animal>
代码将被解读为“未知类型是 Animal 的超类型,可能是 Animal 本身”。你也可以用无界通配符指定未知类型,它看起来像<?>
。无界通配符基本上等同于<? extends Object>
。
这里有一个具体的例子。假设你有一个
class Base {}
现在有一个类 Extender
继承自 Base
如果你有一个 Collection<Extender> collection
并且想要使用这个方法调用它。
public void doSomething(Collection<Base> c){...}
以上方法将无法工作或编译。可行的方法是:
doSomething(Collection<? extends Base> c)
这基本上是说我不关心 ?
的类型,但它必须扩展 Base。现在你明白了,它会帮助你理解 ?
的含义。它与使用 <? extends Object>
相同。