27.1 原因
使用 Array.asList方法生成的ArrayList继承的是AbstractList抽象类 ,如下图所示。
AbstractList又继承了AbstractCollection抽象类,实现了List接口的方法,如下图所示。
如下图所示。可以发现, AbstractionCollection实现了List接口的add和addAll方法。
实现的add方法如下:
它直接抛出了一个异常,因此只要调用add方法就会抛出异常。
实现的allAll方法如下:
调用了add方法,但是一旦调用add方法就会抛出异常,因此调用allAll方法也会抛出异常。
27.2 如何使Arrays生成的ArrayList集合可以调用add或addAll方法
对于ArrayList,它的有参构造方法中可以传入Collection对象,而List接口继承了Collection接口,Arrays生成的ArrayList又实现了List接口,因此可以将生成的ArrayList作为ArrayList有参构造方法的输入对它进行转换,生成新的ArrayList。
新生成的ArrayList中的add方法具有添加元素的作用,因此可以调用add和addAll方法。