为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

largeQ 2021-05-14 18:23:22
我已经创建了一个像这样的语法的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?
查看完整描述

3 回答

?
PIPIONE

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 = ...


查看完整回答
反对 回复 2021-05-26
?
12345678_0001

TA贡献1802条经验 获得超5个赞

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

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


查看完整回答
反对 回复 2021-05-26
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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

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

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

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

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


查看完整回答
反对 回复 2021-05-26
  • 3 回答
  • 0 关注
  • 203 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信