与对象通配符的普通arraylist

时间:2013-02-11 10:41:48

标签: java generics

我创建了一个如下所示的列表。

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>();

一切正常。它是下限。任何人都可以向我解释。

2 个答案:

答案 0 :(得分:3)

当您的集合使用带有上边界的通配符作为泛型类型时,您无法在集合中添加任何内容 。原因是你可能只是在你的收藏中添加错误的时间。有关详细说明Refer This

答案 1 :(得分:0)

声明ArrayList <? extends Object> arr表示arrArrayList,其中包含某些未知类型的元素,并且唯一知道此未知类型的是它扩展Object。一旦你不知道ArrayList元素的类型,你可以放在null的唯一值。放置任何其他值将导致错误,因为编译器无法验证您放入ArrayList的值是否可转换为(未知)类型的ArrayList元素。事件以下代码将是非法的:

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

这是非法的,因为从编译器的角度来看arr.get (0)会返回一些未知类型的值,它会扩展对象,所以它会像arr.set (0, (Object)arr.get (0))那样威胁到它。但它无法安全地将Object类型的值放入arr,因为arr不是ArrayList的{​​{1}},而是Object或某种未知类型延伸ArrayList。它可能是Object ArrayListString整数或其他。