在列表上调用.sort时AbstractList UnsupportedOperationException

sty*_*972 0 java collections android exception kotlin

我正在使用Collections.sort()对列表进行排序,这似乎在我测试它的所有方式中都可以正常工作。我的一些用户崩溃了。

Caused by java.lang.UnsupportedOperationException
    java.util.AbstractList.set (AbstractList.java:681)
    java.util.AbstractList$FullListIterator.set (AbstractList.java:143)
    java.util.Collections.sort (Collections.java:1909)
    com.myapp.MyFragment.myMethod (MyFragment.java:225)
Run Code Online (Sandbox Code Playgroud)

但是,我正在做的就是尝试对列表进行排序

private void myMethod(List<MyThing> myThings) {

    Collections.sort(myList, (thing1, thing2) -> Long.compare(thing2.getLongValue(), thing1.getLongValue()));
Run Code Online (Sandbox Code Playgroud)

我注意到这在Android 8及更高版本上不会发生。它仅发生在5.0-7.1

该列表被实例化为ArrayList,进行填充,并设置为作为通用列表的类的实例的成员。然后将该对象与EventBus一起发布。然后使用Kotlin mapsortedByDescending函数映射并排序列表。然后将映射和排序的列表传递给myMethod()

这个Kotlin扩展正在生成传递给此方法的列表:

fun List<MyThing>.mapAndSort(context: Context): List<MyThing> {
    return mapNotNull {
        when (it.type) {
            type -> it.getTyped(context) //all of these return polymorphic MyThings
            anotherType -> it.getAnotherTyped(context)
            someOtherType -> it.getSomeOtherTyped(context)
            yetAnotherType -> it.getYetAnotherType(context)
            yetOneMoreType -> it.getYetOneMoreType(context)
            finallyLastTyope -> it.getFinallyLastType(context)
            else -> null
        }
    }.sortedByDescending { it.longValue }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经看到此列表是java.util.Arrays$ArrayListkotlin.collections.EmptyList

我认为这与EventBus有关,但可能是Kotlin传递了Kotlin收藏夹列表类型。有人知道到底发生了什么吗?

Ily*_*lya 5

Collections.sort是就地列表变异操作。如果要在Java方法中调用它,请仅在静态传递的MutableListKotlin中传递一个列表。

如果您具有List未知的可变性,则可以MutableList通过.toMutableList()在其上调用扩展功能来从中获得一个。

而且,如果不是myMethod用Java编写对list.sortedByDescending { it.longValue }您而言并不重要,则可以用Kotlin中的call 代替它,那么您无需先将该列表转换为可变列表。实际上,这就是mapAndSort方法的最终目的,因此看起来无需再次对其进行排序。