我已经创建了一个像这样的语法的数组列表:
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
中添加哪些对象?。
答案 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 = ...