抬头仰望星空,是否能发现自己的渺小。

伪斜杠青年

人们总是混淆了欲望和理想

Enum.asList remove throw java.lang.UnsupportedOperationException

在一次偶然的使用中发现了这个问题,场景是我有一个 enum class 需要转为列表,在我查看了相关 api 后,成功的找到了语法糖 asList(),以一贯看源码的方式跟了下:

/**
 * Returns a [List] that wraps the original array.
 */
public actual fun <T> Array<out T>.asList(): List<T> {
    return ArraysUtilJVM.asList(this)
}
class ArraysUtilJVM {
static <T> List<T> asList(T[] array) {
return Arrays.asList(array);
}
}
package java.util;

@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

看到这里我就很放心的取巧了一下:

Enums.values().asList() as MutableList

再然后我就开始了我的增删改查,然后就迎来了这么一个错误:

java.lang.UnsupportedOperationException
        at java.util.AbstractList.remove(AbstractList.java:161)
        at java.util.AbstractList$Itr.remove(AbstractList.java:374)
        at java.util.AbstractCollection.remove(AbstractCollection.java:293)

我之所以选择强转是因为我习惯了使用 mutableListOf<>(),而这个的源码是这样的:

/**
 * Returns an empty new [MutableList].
 * @sample samples.collections.Collections.Lists.emptyMutableList
 */
@SinceKotlin("1.1")
@kotlin.internal.InlineOnly
public inline fun <T> mutableListOf(): MutableList<T> = ArrayList()
package kotlin.collections

expect class ArrayList<E> : MutableList<E>, RandomAccess

明明 ArrayList 实现了 MutableList 接口,为什么还给我抛出一个 UnsupportedOperationException 呢?
想了想,大意了,这两个 ArrayList 一个是 kotlin 的, 一个是 Java 的,代码不同、包不同、实现不同 。。。

知道原因了,解决办法就很简单,强转的时候 强转为 Java 的 ArrayList 即可,或者不考虑损耗,用toMutableList() 语法糖也可以。


本站由以下主机服务商提供服务支持:

0条评论

发表评论