Кастинг Kotlin ArrayLists ClassCastException - PullRequest
0 голосов
/ 02 июля 2018

У меня есть MutableList<Card> с именем cards, который я сортирую на основе одного из свойств, используя функцию 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

РЕДАКТИРОВАТЬ: Я только что понял, что мне нужно использовать более общий тип карт для разыгрывания, MutableList<Card>. Теперь кто-нибудь может объяснить, почему происходит сбой приведения с использованием ArrayList?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Существуют более простые способы сортировки списка на месте без создания нового и назначения его обратно оригиналу. Самое простое это cards.sortBy { it.face }

0 голосов
/ 02 июля 2018

Приведение не выполняется, поскольку список, возвращаемый функцией 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()
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...