关于Java:ArrayList中的<?>符号是什么意思

What does <?> sign mean in ArrayList

在android的ArrayList中,例如simplelistadapter,我通常会看到ArrayList<?>,在一些教程中,我回顾了<?>被某些值替换了。但是我仍然不太确定这代表什么变量或限定符。


它称为泛型。

例如,您可以执行以下操作:

1
2
3
4
5
6
ArrayList<Integer> list = new ArrayList();
list.add(new Integer(1));
list.add(new Integer(2));
.....

Integer i = (Integer)list.get(1);

或者您可以这样做:

1
2
3
4
5
6
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(new Integer(1));
list.add(new Integer(2));
.....

Integer i = list.get(1);

如您所见,无需强制转换。


是通用类型的通配符。通常,您声明一个数组列表,例如:

1
ArrayList<String>

确切指定类型的位置。该列表将包含字符串。
但是有时您想创建一个方法或一个采用任何类型ArrayList的类,或者想要一个指向任何类型ArrayList的字段

1
2
3
public void removeFirstItem(ArrayList< ? > target) {
...
}

现在此方法可以使用ArrayList<String>ArrayList<Long>等,并对其进行一些操作。

类似的,您可以有一个局部变量:

1
2
3
ArrayList< ? > someList;
someList = new ArrayList<String>();
someList = new ArrayList<Long>);

这有效,而:

1
2
ArrayList<String> someList = new ArrayList<String>();
someList = new ArrayList<Long>();

不会,因为someList被指定为ArrayList<String>,所以只能将ArrayList<String>分配给它。


这意味着ArrayList可以包含任何非原始类型。


这是有关泛型的问题。 <(种类的对象)>语法表示只能将某种种类的对象(类实例)作为参数传递。有了语法,就是说可以传递任何类型的类实例。


语法是"通配符"。 Java泛型需要它:

  • http://www.oracle.com/technetwork/articles/javase/generics-136597.html

  • List <?>在Java泛型中是什么意思?

通配符可以是"有界的"或"无界的"。整个编译/设计时通用类型的问题与运行时JVM的"类型擦除"问题密切相关:

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

  • http://docs.oracle.com/javase/tutorial/java/generics/erasure.html

'希望有所帮助的.. pSM


类似于ArrayList<? extends Object>,这意味着它可以包含任何从Object类继承的对象(即Java中的所有对象)。