Casting Kotlin ArrayLists ClassCastException

Casting Kotlin ArrayLists ClassCastException,kotlin,Kotlin,我有一个名为cards的MutableList,我正在使用sortedWith功能根据其中一个属性进行排序。这将返回已排序的泛型列表类型,因此需要强制转换。但是,当我强制转换列表时,它会因ClassCastException崩溃: private var cards: MutableList<Card> = ArrayList() ... cards = cards.sortedWith(compareBy{it.face}) as ArrayList<Card>

我有一个名为
cards
MutableList
,我正在使用
sortedWith
功能根据其中一个属性进行排序。这将返回已排序的泛型列表类型,因此需要强制转换。但是,当我强制转换列表时,它会因ClassCastException崩溃:

private var cards: MutableList<Card> = ArrayList()
...
cards = cards.sortedWith(compareBy{it.face}) as ArrayList<Card>



java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
private var cards:MutableList=ArrayList()
...
cards=cards.sorted(compareBy{it.face})作为ArrayList
java.lang.ClassCastException:java.util.Arrays$ArrayList不能强制转换为java.util.ArrayList

编辑:我刚刚意识到我需要为演员使用更通用的卡片类型,
MutableList
。现在,有人能解释为什么使用ArrayList进行强制转换失败吗?

强制转换失败,因为使用函数返回的列表不是
java.util.ArrayList
的实例

此外,将其强制转换为
MutableList
也是不安全的,因为
sortedWith
的实现可以稍后更改,因此它返回的
List
不再是
MutableList

如果您有一个
可变列表
,并且希望对其进行排序,则有两个选项:

  • 使用
    sortWith
    功能将其排序到位(而不是
    sortedWith
    ):

  • 或者将其排序到一个新列表中,然后将其复制到一个可变列表中,如果以后需要对其进行变异的话

    cards = cards.sortedWith(compareBy{it.face}).toMutableList()
    

有更简单的方法可以对列表进行适当排序,而无需创建新列表并重新分配给原始列表。最简单的是
cards.sortBy{it.face}

谢谢,将其排序到位是一个更好的选择。使用sortWith和sortBy进行就地排序有什么区别?@GusW
sortBy{}
sortWith(compareBy{})的快捷方式
。最好单独提问,这样你会得到更详细的答案。
cards = cards.sortedWith(compareBy{it.face}).toMutableList()