我创建了一个如下所示的列表。
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>();
一切正常。它是下限。任何人都可以向我解释。
答案 0 :(得分:3)
当您的集合使用带有上边界的通配符作为泛型类型时,您无法在集合中添加任何内容
答案 1 :(得分: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
不是ArrayList
的{{1}},而是Object
或某种未知类型延伸ArrayList
。它可能是Object
ArrayList
或String
整数或其他。