0

我创建了一个如下列表。

ArrayList<? extends Object> arr = new ArrayList<Object>();

我通过上面的线理解这是一个上限,任何作为对象子类的元素都可以添加到列表中。现在我正在尝试这样:

String str = new String("str");
Integer i = new Integer(4);
Object obj = new Object();
arr.add(obj);
arr.add(str);
arr.add(i);

他们都给出了错误。这里有什么问题?但是当我把它改成

ArrayList<? super Object> arr = new ArrayList<Object>();

一切正常。这是下界。谁能给我解释一下。

4

2 回答 2

3

当您的集合使用具有上限的通配符作为泛型类型时,您不能将任何内容添加到集合中,除了 null 。原因是您可能只是在收藏中添加了错误的时间。更多解释参考这里

于 2013-02-11T10:43:34.420 回答
0

声明ArrayList <? extends Object> arr意味着它arr带有ArrayList某种未知类型的元素,而关于这种未知类型的唯一已知就是它扩展了Object。一旦你不知道ArrayList元素的类型,你可以放在那里的唯一值就是null. 放入任何其他值将导致错误,因为编译器无法验证您放入的值是否可ArrayList转换为(未知)类型的ArrayList元素。事件以下代码将是非法的:

arr.set (0, arr.get (0));

这是非法的,因为从编译器的角度来看,它arr.get (0)会返回一些未知类型的值,它扩展了对象,所以它会像arr.set (0, (Object)arr.get (0)). 但它不能安全地将类型的值Object放入arr,因为arr不是ArrayListObject而是ArrayList扩展的某种未知类型Object。它可能是ArrayListInteger或其他的StringArrayList

于 2013-02-11T12:23:13.487 回答