Java-使用通配符列表创建arraylist

时间:2018-07-15 10:51:35

标签: java generics wildcard

我已经创建了一个像这样的语法的数组列表:

List<?> obj = new ArrayList<Object>();

如果我尝试添加新对象或任何类似字符串的对象。它给了我编译错误:

obj.add(new Object());

The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (Object)

我可以在obj中添加哪些对象?。

3 个答案:

答案 0 :(得分:1)

我们不能添加任何内容(唯一的例外是null)。参见tutorial

  

但是向其中添加任意对象并不安全:

     

Collection<?> c = new ArrayList<String>();

     

c.add(new Object()); //Compile time error

     

由于我们不知道c的元素类型代表什么,因此我们无法   向其添加对象。 add()方法采用类型E的参数,   集合的元素类型。当实际类型参数为?时,   它代表某种未知类型。我们传递来添加的任何参数都会   必须是此未知类型的子类型。既然不知道   类型,即我们不能传入任何内容。唯一的例外是null,   是每种类型的成员。

答案 1 :(得分:1)

List<?>的意思是“这是一个列表,但我不知道列表中的对象类型”。即使您已将此声明为new List<Object>(),也可以稍后将其重新分配给new List<String>()。将new Object()添加到List<String>并不是一个好主意。

在您的情况下,应将其声明为List<Object>而不是List<?>

答案 2 :(得分:0)

您只能在声明的null中添加List

List<?> obj = ...

否则您可能会破坏类型安全性,因为这是合法的:

List<?> anyList = ...;
List<Integer> integerList = ...;
anyList = integerList;

这也是合法的:

List<Integer> integerList = ...;
foo(integerList);

void foo(List<?> anyList) {
   ...  
}

如果您可以在List<?>中添加任何内容,例如String,则integerList引用的列表对象将不再仅包含Integer

要在List中添加任何元素,只需使用Object类型:

List<Object> obj = ...