铸造Kotlin ArrayLists ClassCastException

时间:2018-07-01 23:06:07

标签: kotlin

我有一个名为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进行强制转换失败吗?

2 个答案:

答案 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 }