问题描述:
在代码中使用到了Arrays.asList(strings);将数组转换为List<String>
然后使用add("test3")添加新的元素的时候出了问题,代码如下
String[] strings = new String[]{"test1", "test2"};
List<String> propertyTypeEnums = Arrays.asList(strings);
try {
propertyTypeEnums.add("test3");
} catch (Exception e) {
e.printStackTrace();
}
报错如下
java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
问题分析:
通过查看源代码:Arrays.asList()方法最终返回ArrayList
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
此ArrayList是Arrays的内部类,即:java.util.Arrays$ArrayList
package java.util;
public class Arrays {
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{...}
}
并非常用的 java.util.ArrayList
package java.util;
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
}
java.util.ArrayList和java.util.Arrays$ArrayList都继承自 java.util.AbstractList,区别在于后者重写了add方法
若不重写,将调用父类add方法,此方法默认抛出 UnsupportedOperationException
package java.util;
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
}
问题解决:
使用new ArrayList()方式转换
List<String> propertyTypeEnums = new ArrayList<String>(Arrays.asList(strings));
try {
propertyTypeEnums.add("test3");
} catch (Exception e) {
e.printStackTrace();
}