我有一个名为MutableList<Card>
的{{1}},使用cards
函数根据其中一个属性进行排序。这将返回已排序的通用列表类型,因此必须进行强制转换。但是,当我投射列表时,它崩溃并显示ClassCastException:
sortedWith
编辑:我刚刚意识到我需要对演员表使用更通用的卡片类型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
。现在,有人可以解释为什么使用ArrayList进行强制转换失败吗?
答案 0 :(得分:3)
强制转换失败,因为sortedWith
函数返回的列表不是java.util.ArrayList
的实例。
此外,将其强制转换为MutableList
也是不安全的,因为以后可以更改sortedWith
的实现,因此它返回的List
不再是MutableList
。
如果您有MutableList
并想对其进行排序,则有两个选择:
可以使用sortWith
函数(而不是sortedWith
)对它进行就地排序:
cards.sortWith(compareBy{it.face})
// now cards list is sorted
或将其排序到新列表中,然后将其复制到可变列表中,如果您需要在之后对其进行突变
cards = cards.sortedWith(compareBy{it.face}).toMutableList()
答案 1 :(得分:0)
有一些更简便的方法可以对列表进行排序,而无需创建新列表并将其分配回原始列表。最简单的是cards.sortBy { it.face }