猿问

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

我已经创建了一个像这样的语法的arraylist:


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?


largeQ
浏览 192回答 3
3回答

PIPIONE

您只能null在已List声明的内容中添加任何内容:List<?> obj = ...否则您可能会破坏类型安全性,因为这是合法的:List<?> anyList = ...;List<Integer> integerList = ...;anyList = integerList;这也是合法的:List<Integer> integerList = ...;foo(integerList);void foo(List<?> anyList) {&nbsp; &nbsp;...&nbsp;&nbsp;}如果您可以在中添加任何内容,List<?>例如String,则所引用的列表对象integerList将Integer不再仅包含。要在中添加任何元素List,只需使用Object类型:List<Object> obj = ...

12345678_0001

List<?>表示“这是一个列表,但我不知道列表中的对象类型”。即使您已将此声明为new List<Object>(),也可以稍后将其重新分配给new List<String>()(例如)。new Object()在a后面加上aList<String>不是一个好主意。在您的情况下,应将其声明为,List<Object>而不是List<?>。

牧羊人nacy

我们不能对其添加任何内容(唯一的例外是null)。参见教程:但是向其中添加任意对象并不安全:Collection<?> c = new ArrayList<String>();c.add(new Object()); //Compile time error由于我们不知道c的元素类型代表什么,因此无法向其添加对象。add()方法采用类型E(集合的元素类型)的参数。当实际类型参数为?时,表示某些未知类型。我们传递来添加的任何参数都必须是该未知类型的子类型。由于我们不知道是什么类型,因此无法传递任何内容。唯一的例外是null,它是每种类型的成员。
随时随地看视频慕课网APP

相关分类

Java
我要回答