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进行就地排序有什么区别?@GusWsortBy{}
是sortWith(compareBy{})的快捷方式
。最好单独提问,这样你会得到更详细的答案。
cards = cards.sortedWith(compareBy{it.face}).toMutableList()