使用com.google.common.collect.ImmutableList初始化List,当进行add操作时,报java.lang.UnsupportedOperationException: null 错误。
List<Integer> list = ImmutableList.of(11, 22, 33);
list.add(555);
报错提示:
原因:
不是所有初始化的List都有add remove等操作。
例如Arrays.asList和一些第三方工具比如google ImmutableList初始化返回的List。
实际上我看看Immutable的意思:
解决办法:
List<Integer> list = new ArrayList<>(ImmutableList.of(11, 22, 33));
list.add(555);
分析ImmutableList.of创建List:
让我们来看源码
public static <E> ImmutableList<E> of(E e1, E e2, E e3) {
return construct(e1, e2, e3);
}
private static <E> ImmutableList<E> construct(Object... elements) {
return asImmutableList(ObjectArrays.checkElementsNotNull(elements));
}
static <E> ImmutableList<E> asImmutableList(Object[] elements) {
return asImmutableList(elements, elements.length);
}
static <E> ImmutableList<E> asImmutableList(Object[] elements, int length) {
switch(length) {
case 0:
return of();
case 1:
return of(elements[0]);
default:
if (length < elements.length) {
elements = Arrays.copyOf(elements, length);
}
return new RegularImmutableList(elements);
}
}
ImmutableList抽象类add方法:
返回的RegularImmutableList类继承ImmutableList,可以看到ImmutableList抽象类add方法是这样设计的,所以调用直接抛UnsupportedOperationException异常就不言而喻了。