ArrayList <T> vs ArrayList <?>

Eng*_*uad 10 java generics

我知道用的是什么ArrayList<T>,但我什么时候应该使用ArrayList<?>?你能用例子解释一下吗?谢谢.

Str*_*ior 13

据我所知,ArrayList<?>基本上告诉编译器:

是的,我知道有一个通用版本的ArrayList可供我使用,但我真的,真的不知道我期望在这个中使用什么类型的对象.所以不要给我警告我不会按照我应该的方式使用泛型.

更新

我刚刚了解到,使用Raw Types(ArrayList)和泛型(带通配符(ArrayList<?>))之间存在真正的区别,这不仅仅是避免编译器警告.显然,一旦您将某些内容声明为Raw类型,即使泛型不是基于您省略的类型,也不会对该类型的任何方法起作用泛型.请看这里的例子.

因此,虽然我的原始答案通常是正确的,但我认为重要的是提到使用ArrayList<?>ArrayList不仅仅是删除编译器警告的问题.

  • 使用通配符参数的原始类型和类型之间存在更多差异.例如,您可以将对象添加到原始ArrayList,但不能添加到"ArrayList <?>" (3认同)
  • 这应该不适用于Java(生产者扩展,消费者超级).另外,你甚至不能在Java中使用`new ArrayList <?>()`,所以也许Groovy有点不同 (2认同)

Sam*_*Sam 5

ArrayList<?>表示一个未知对象的集合,也就是说,它可以是任何东西.可以从中读取,但您无法写入.

听起来像这样:

我是一个集合!我可以读未知,但由于我不知道它的类型,我不能添加东西

请参阅Oracle的这个非常有用的教程.

另外,我发现这些来自MIT Software Construction类的幻灯片非常有用,而且这个泛型教程.


pad*_*dis 5

http://download.oracle.com/javase/tutorial/java/generics/wildcards.html

注意:也可以使用super关键字而不是extends来指定下限.<? super Animal>因此,代码将被解读为"未知类型,它是动物的超类型,可能是动物本身".您还可以使用无界通配符指定未知类型,它看起来就像<?>.无界的通配符基本上与说法相同<? extends Object>.