3 回答
![?](http://img1.sycdn.imooc.com/545863e80001889e02200220-100-100.jpg)
TA贡献1829条经验 获得超9个赞
您只能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 = ...
![?](http://img1.sycdn.imooc.com/54584f850001c0bc02200220-100-100.jpg)
TA贡献1802条经验 获得超5个赞
List<?>
表示“这是一个列表,但我不知道列表中的对象类型”。即使您已将此声明为new List<Object>()
,也可以稍后将其重新分配给new List<String>()
(例如)。new Object()
在a后面加上aList<String>
不是一个好主意。
在您的情况下,应将其声明为,List<Object>
而不是List<?>
。
![?](http://img1.sycdn.imooc.com/54586870000183e302200220-100-100.jpg)
TA贡献1862条经验 获得超7个赞
我们不能对其添加任何内容(唯一的例外是null)。参见教程:
但是向其中添加任意对象并不安全:
Collection<?> c = new ArrayList<String>();
c.add(new Object()); //Compile time error
由于我们不知道c的元素类型代表什么,因此无法向其添加对象。add()方法采用类型E(集合的元素类型)的参数。当实际类型参数为?时,表示某些未知类型。我们传递来添加的任何参数都必须是该未知类型的子类型。由于我们不知道是什么类型,因此无法传递任何内容。唯一的例外是null,它是每种类型的成员。
添加回答
举报