在一次偶然的使用中发现了这个问题,场景是我有一个 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条评论