【问题标题】:Unable to perform an operation on ArrayList [duplicate]无法对 ArrayList 执行操作 [重复]
【发布时间】:2021-11-24 02:26:15
【问题描述】:

我的意图是对ArrayList 进行浅层克隆,但在此之前我在修改列表时遇到了问题。 在列表中添加另一个元素

UnsupportedOrderException

为什么?

class Mine implements Cloneable {
    public List<Integer> list;
    Mine(List<Integer> mylist) {
        this.list = mylist;
    }
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        List<Integer> klist= Arrays.asList(10,20,30,40,50);
        Mine m1=new Mine(klist);
        m1.list.add(11); // <- why i am unable to add to the list
        Mine m2= (Mine) m1.clone();
    }
}

【问题讨论】:

  • @AritroShome, List 是一个有很多实现的接口,而不仅仅是ArrayList
  • List 是一个接口,它本身没有实现。改用ArrayList&lt;T&gt;,实现List

标签: java oop


【解决方案1】:

除了@dan1st 的回答(现在还有@JonSkeet),您可以创建自己的asList() 方法来返回一个可变 List&lt;T&gt;

static public List<T> asMutableList(T ... elts) {
    List<T> lst = new ArrayList<>(elts.length);
    for (T el : elts) {
        lst.add(el);
    }
    return lst;
}

【讨论】:

    【解决方案2】:

    您不能更改Arrays.asList 返回的List(使用add()remove() 或类似)的元素数量(但它允许使用.set() 更改元素)。

    来自the docs of Arrays.asList

    返回的列表实现了可选的 Collection 方法,那些会改变返回列表大小的方法除外。这些方法使列表保持不变并抛出 UnsupportedOperationException。

    相反,您可以创建一个具有相同元素的ArrayList

    List<Integer> klist= new ArrayList<>(Arrays.asList(10,20,30,40,50));
    

    【讨论】:

    • 一般来说,只有当您打算永远不修改 List 时,In 才会使用 Arrays.asList
    • @dan1st 做ArrayList&lt;MyObject&gt; = Arrays.asList(myObjectArray);之类的事情是不是错了?
    • 是的,这是行不通的,因为它不会创建ArrayList,而只会尝试分配给ArrayList,从而导致编译时错误,因为Arrays.asList 不会返回@987654336 @.
    • 我添加了文档链接。
    【解决方案3】:

    Arrays.asList() 返回由原始数组支持的List&lt;T&gt; 实现。 (换成数组可以通过列表看到,反之亦然。)

    数组在 Java 中具有固定大小,因此 Arrays.asList 返回的列表也必须具有固定大小 - 您无法添加,也无法从中删除。

    您可以改为创建一个新的ArrayList&lt;T&gt;,它会创建数组的副本

    List<Integer> list = new ArrayList<>(Arrays.asList(...));
    

    虽然ArrayList 仍然由数组支持,但它会在必要时创建一个新数组。该数组是一个实现细节,而不是 Arrays.asList 返回的现有数组的“视图”。

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多