之前,写了一个读取文件返回行记录数组String[] lines;之后又写了一个处理方法,形参为List的字符串列表,方法中进行一翻处理将列表集合中某些对象删除,使用的是List中的remove(int index);或remove(Object obj);或removeAll(Collection obj);
但是,当我使用Arrays.asList(lines)传递这个参数过去的时候,方法抛出
UnsupportedOperationException,搞不懂,为什么不支持,结果跟踪了一下。原来,Arrays.asList()方法返回的是ArrayList
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}
return new ArrayList<T>(a);
}
看起来确实可以使用remove(int index);或remove(Object obj);或removeAll(Collection obj);等方法,但事实上这个ArrayList并不是我们常用的
java.util.ArrayList类,而是Arrays中自带的内部静态类
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
……
}
可以看到这个ArrayList继承于AbstractList,AbstractList里确实有remove(int index)方法,但是你可以看到这个抽象类没有真正实现这个方法,仅仅抛出一个异常。
public E remove(int index) {
throw new UnsupportedOperationException();
}
问题就在于此,Arrays中的ArrayList类并没有重写这个remove方法,结果导致在我编写的方法中抛出异常。结果我只好迭代读取数组返回一个“真正的ArrayList”(java.util.ArrayList)来使用我那个方法。要不然的话,那还要自己做一个类去继承这个静态的ArrayList类重写方法。那可不怎么实用了。
要真正了解java还真是十分困难,要是没有源码的支持,恐怕并不知道问题所在。