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

Java-列表使用通配符创建arraylist,java,generics,wildcard,Java,Generics,Wildcard,我创建了如下语法的arraylist: List<?> obj = new ArrayList<Object>(); List obj=new ArrayList(); 如果我尝试添加一个新对象或任何类似字符串的对象。它给了我编译错误: obj.add(new Object()); The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for t

我创建了如下语法的arraylist:

List<?> obj = new ArrayList<Object>();
List obj=new ArrayList();
如果我尝试添加一个新对象或任何类似字符串的对象。它给了我编译错误:

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.add(newobject());
类型列表中的add(capture#1-of?)方法不适用于参数(Object)

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

我们不能向其中添加任何内容(唯一的例外是null)。见:

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

Collection c=newarraylist()

c.add(newobject())//编译时错误

因为我们不知道c的元素类型代表什么,所以我们不能 向其中添加对象。add()方法接受类型为E的参数 集合的元素类型。当实际类型参数为?时?, 它代表某种未知类型。我们传递给add的任何参数都将 必须是此未知类型的子类型。因为我们不知道是什么 也就是说,我们不能传递任何内容。唯一的例外是null, 它是每种类型的成员


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

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

Collection c=newarraylist()

c.add(newobject())//编译时错误

因为我们不知道c的元素类型代表什么,所以我们不能 向其中添加对象。add()方法接受类型为E的参数 集合的元素类型。当实际类型参数为?时?, 它代表某种未知类型。我们传递给add的任何参数都将 必须是此未知类型的子类型。因为我们不知道是什么 也就是说,我们不能传递任何内容。唯一的例外是null, 它是每种类型的成员


您只能在声明的
列表中添加
null

List<?> obj = ...

您只能在声明的
列表中添加
null

List<?> obj = ...
List
的意思是“它是一个列表,但我不知道列表中是什么类型的对象”。即使您已将其声明为
新列表()
,但稍后也可以将其重新分配给
新列表()
(例如)。在
列表中添加
新对象()
不是一个好主意

在您的情况下,您应该将其声明为
列表
,而不是
列表

列表
的意思是“它是一个列表,但我不知道列表中的对象类型”。即使您已将其声明为
新列表()
,但稍后也可以将其重新分配给
新列表()
(例如)。在
列表中添加
新对象()
不是一个好主意


在您的情况下,您应该将其声明为
列表
,而不是
列表

列表
是一个,除了
null
之外,您不能向其添加任何内容。您不能添加任何带有
的内容。请记住PECS。有关通配符的详细说明,请参阅。是否要避免重复
字符串
?好的,使用菱形运算符。
列表
是一个,除了
null
之外,您不能向其中添加任何内容。您不能使用
添加任何内容。请记住PECS。有关通配符的详细说明,请参阅。是否要避免重复
字符串
?好的,用菱形操作符。我不明白下一票。有时候很郁闷,我不明白为什么会投反对票。有时令人沮丧。
List<Integer> integerList = ...;
foo(integerList);

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