Arrays.asList(ia)方法返回一个对象,该对象来自扩展AbstractList类的类,并且AbstractList类实现了List接口。
不幸的是,扩展AbstractList的这个类的名称是ArrayList(与我们所知道的公共ArrayList-java.util.ArrayList相同)。但要小心。这个类是Arrays类的一个内部私有静态类,由Arrays.asList方法创建并返回一个实例。请查看Arrays类的源代码
here。因此,这个内部私有静态类的路径是java.util.Arrays.ArrayList而不是java.util.ArrayList。尽管具有相同的名称,但这些是不同的类,我们无法使用new运算符创建java.util.Arrays.ArrayList,因为它是私有的。只能作为Arrays.asList方法的返回值。
所以我们在数组源代码中看到,内部的私有静态ArrayList类继承了AbstractList类。AbstractList类是实现List接口的抽象类。因此,它必须实现List接口中的两个重载add方法。正如我们在AbstractList类的源代码中看到的那样,它实现了List接口的add(int index,E element)方法,因此总是返回UnsupportedOperationException。
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
为什么?耐心点。实现第二个 add(E element) 方法,将调用以前的 add(int index, E element) 方法,其中第一个参数为列表的大小。
public boolean add(E e) {
add(size(), e);
return true;
}
我很荣幸能在这里...我们继续...
如果一个继承了AbstractList的类(比如Array类的内部ArrayList类)没有覆盖两个继承的add方法,那么每当调用add方法时都会返回UnsupportedOperationException。
检查Array类的内部ArrayList类的源代码,我们发现没有覆盖add(int index, E element)方法...
所以...quod erat demonstrandum。
List#add
的规范中有一部分是:“如果该列表不支持添加操作,则抛出UnsupportedOperationException
”。Arrays.asList
返回的列表实现符合接口规范,并通过抛出这样的异常来执行此操作。 - khelwoodUnsupportedOperationException
异常。 - Jesperadd()
和remove()
是可选操作,可能不受实现类的支持。它们将有一些实现,但可能只是抛出异常。 - shmosel