为什么我不能使用方法返回的列表引用添加元素

时间:2017-11-26 09:12:20

标签: java arraylist collections

我使用按方法返回的列表引用添加元素时出错。

Dummy.java

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class count {

    public static void main(String[] args) {
        Dummy obj = new Dummy(Arrays.asList("foo1", "foo2", "foo3", "foo4", "foo5"));
        List<String> name = obj.getNames();
        name.add("foo6");
        System.out.println(name);

    }

}

主要

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    at firstPro.count.main(count.java:13)

错误

{{1}}

我知道我可以通过添加

来摆脱这个错误
  

new ArrayList(obj.getNames())

我的问题是为什么我不能将那种引用用作原始的?

3 个答案:

答案 0 :(得分:2)

来自Arrays.asList(...)的JavaDoc,强调我的:

  

返回由指定数组支持的固定大小列表。

您可以使Dummy处理修改,方法是将接收到的列表中的值复制到新的ArrayList实例中, 通过更改其构造函数:

public Dummy(List<String> names) {
    this.names = new ArrayList<>(names);
}

答案 1 :(得分:2)

Arrays.asList("foo1", "foo2", "foo3", "foo4", "foo5")创建一个固定大小的列表,因此您无法向其添加/删除元素(仅修改现有元素或替换现有索引中的元素)。

您可以使用:

new ArrayList<>(Arrays.asList("foo1", "foo2", "foo3", "foo4", "foo5"))

支持添加新元素。

答案 2 :(得分:1)

引用Arrays.asList的文档:

  

返回由指定数组支持的固定大小列表。

由于返回的List具有固定大小,因此它不支持add操作,并且调用它会抛出UnsupportedOperationException,因为您已经注意到了。