人们说该asList方法将数组转换为列表而不是复制,因此'aList'中的每个更改都会反映为'a'.因此,在'aList'中添加新值是非法的,因为数组具有固定的大小.
但是,asList()方法返回ArrayList<T>.编译器如何将第3行与5区分开来.第3行给出了exception(UnsupportedOperationException).
String[] a = {"a","b","c","d"};//1
List<String> aList = Arrays.asList(a);//2
aList.add("e");//3
List<String> b = new ArrayList<String>();//4
b.add("a");//5
Run Code Online (Sandbox Code Playgroud)
And*_*s_D 35
您从此接收的List实现Arrays.asList是阵列上的特殊视图 - 您无法更改它的大小.
返回类型的Arrays.asList()就是java.util.Arrays.ArrayList这往往是迷茫java.util.ArrayList.Arrays.ArrayList只是将数组显示为列表.
再读一遍,Arrays.asList的类型是:
public static <T> List<T> asList(T... a)
Run Code Online (Sandbox Code Playgroud)
这清楚地表明asList返回一个实现接口java.util.List的对象,它说它将返回类java.util.ArrayList的实例.
接下来,请注意List.add上的文档说:
布尔加法(E e)
将指定的元素追加到此列表的末尾(可选操作).
从技术上讲,每次使用类型为List(而不是ArrayList)的变量时,都应该始终注意这个方法可能会抛出UnsupportedOperationException.如果您确定只接收到始终具有正确语义的List实现.add(),那么当您的假设失效时,您可以省略检查,从而存在错误风险.
asList()不返回 a java.util.ArrayList,它返回 a java.util.Arrays$ArrayList。这个类甚至不扩展java.util.ArrayList,因此它的行为可以(并且确实)完全不同。
该add()方法继承自java.util.AbstractList,默认情况下仅抛出UnsupportedOperationException。
马诺,
Arrays.List的Return类型是List接口的一些未知内部实现,而不是 java.util.ArrayList,因此您只能将它分配给List类型.
例如,如果将它分配给ArrayList,它将为您提供编译时错误"类型不匹配:无法从List转换为ArrayList"
ArrayList<String> aList = Arrays.asList(a);// gives Compile time error
Run Code Online (Sandbox Code Playgroud)
来自Javadoc "Arrays.asList"返回由指定数组支持的固定大小列表.(对返回列表的更改"直写"到数组.)"这意味着您只提供了IMO的列表视图是在运行时创建的,当然你不能改变数组的大小,所以你也不能改变"Arrays.asList"的大小.
IMO Arrays.asList的内部实现具有所有可以改变数组大小的实现方法 -
void add(E e)
{
//some unknown code
throw(java.lang.UnsupportedOperationException);
}
Run Code Online (Sandbox Code Playgroud)
因此,每当您尝试更改Array的大小时,它都会抛出UnsupportedOperationException.
如果你想通过使用这样的语法将一些新项添加到ArrayList,你可以通过创建Arraylist的子类(最好是使用ArrayList的匿名子类)来实现.你可以将Arrays.List的返回类型传递给ArrayList的构造函数(即public ArrayList(Collection c))这样的东西 -
List<String> girlFriends = new java.util.ArrayList<String>(Arrays.asList("Rose", "Leena", "Kim", "Tina"));
girlFriends.add("Sarah");
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用相同的语法轻松地将Sarah添加到GF列表中.
PS - 请选择这一个或另一个作为你的答案,因为已经解释了evrything.您的低接受率非常令人沮丧.
这是一个异常,而不是编译器错误。它是在程序运行时而不是编译时抛出的。基本上 Arrays.asList 将返回的实际类有一个throw UnsupporteOperationException内部add()方法。
更具体地说,将返回在派生自该方法且未实现该方法的类Arrays.asList内部定义的内部类。的方法实际上是抛出异常。ArraysAbstractListaddaddAbstractList
| 归档时间: |
|
| 查看次数: |
15933 次 |
| 最近记录: |