看了下Array.asList的源代码,源代码如下:[code=java]public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}[/code]这里的ArrayList并不是java.util.ArrayList,而是Array.java的一个内部类,它只不过是需要转换数组的引用而已[code=java]private static class ArrayList<E> extends AbstractList<E> implements RandomAccess,java.io.Serializable
//AbstractList实现了List接口,该类中也的确有add和remove方法,但打开一看出乎意料
public boolean add(E e) {
add(size(), e);
return true;
}
/**
* {@inheritDoc}
*
* <p>This implementation always throws an
* {@code UnsupportedOperationException}.
*
* @throws UnsupportedOperationException {@inheritDoc}
* @throws ClassCastException {@inheritDoc}
* @throws NullPointerException {@inheritDoc}
* @throws IllegalArgumentException {@inheritDoc}
* @throws IndexOutOfBoundsException {@inheritDoc}
*/
public void add(int index, E element) {
throw new UnsupportedOperationException();
}[/code]这个add方法总是跑出异常UnsupportedOperationException,remove方法也是如此。
总结:
在使用Arrays.asList()后调用add,remove这些method时出现java.lang.UnsupportedOperationException异常。
原因:这是由于Arrays.asList() 返回java.util.Arrays$ArrayList, 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList,remove,add等method在AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。ArrayList override这些method来对list进行操作,但是Arrays$ArrayList没有override remove(),add()等,所以throw UnsupportedOperationException。 搞了很久,最后才查出来这个问题。
解决办法是使用List lst = new ArrayList()构造一个list,然后通过for循环将值放进lst里面去、还是少用asList
[ 本帖最后由 詹季春 于 2011-08-06 00:11 编辑 ] |