6

Enum.asList remove throw java.lang.UnsupportedOperationException

 2 years ago
source link: http://i.lckiss.com/?p=7968
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Enum.asList remove throw java.lang.UnsupportedOperationException

2022-04-13

在一次偶然的使用中发现了这个问题,场景是我有一个 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() 语法糖也可以。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK