【问题标题】:Generic arraylist with wild card of object [duplicate]带有对象通配符的通用数组列表[重复]
【发布时间】:2013-02-11 10:41:48
【问题描述】:

我创建了如下列表。

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

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

【问题讨论】:

    标签: java generics


    【解决方案1】:

    当您的集合使用具有上限的通配符作为泛型类型时,您无法向集合中添加任何内容null 除外。原因是您可能只是在收藏中添加了错误的时间。更多解释Refer This

    【讨论】:

      【解决方案2】:

      声明ArrayList &lt;? extends Object&gt; 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 不是ObjectArrayList,而是ArrayList 或扩展Object 的某些未知类型。它可能是StringArrayList 或整数的ArrayList 或其他。

      【讨论】:

      • 那么它为什么起作用?数组列表 arr = new ArrayList();这里我们也有未知类型。
      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多