在一次偶然的使用中发现了这个问题,场景是我有一个 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() 语法糖也可以。
本站广告由 Google AdSense 提供
0条评论