Получение kotlin .TypeCastException при попытке использовать parcelable для переменной ArrayList, которая содержит пустые поля - PullRequest
0 голосов
/ 26 февраля 2020

Я буквально вчера начал с использования Kotlin, поэтому мне все еще трудно понять основные принципы. Я хочу отправить объект через намерение к другой деятельности и реализовал parcelable на объекте. Объект содержит несколько списков MutableLists в виде:

var favoritePlaces: MutableList<String?>? = null

Я использовал этот конструктор метода для его разделения:

constructor(`in`: Parcel) {
  `in`.readList(favoritePlaces, String::class.java.classLoader)
}

Это ошибка, которую я получаю в Android Studio, так как существует несоответствие типов:

Android Studio error

Я попытался go с предложением Android Studio оставив меня здесь, в конструкторе:

constructor(`in`: Parcel) {
   `in`.readList(favoritePlaces as List<*>, String::class.java.classLoader)
 }

И в методе writeToParcel:

override fun writeToParcel(dest: Parcel, flags: Int) {
    dest.writeList(favoritePlaces as List<*>?)
}

Но когда я пытаюсь использовать это, я получаю следующее сообщение об ошибке при запуске Activity:

java .lang.RuntimeException: невозможно запустить действие ComponentInfo {com.test.app.Activity}: kotlin .TypeCastException: нельзя преобразовать значение NULL в ненулевой тип kotlin .collections.List <*>

Я понимаю, что тип kotlin .collections.List <*> является ненулевым типом, и, поскольку у меня есть несколько нулевых полей в моих массивах, имеет смысл, что эта ошибка возникает. Мой вопрос сейчас, как я могу разделить строковые массивы в Kotlin с непустыми, а также пустыми полями ???

1 Ответ

1 голос
/ 26 февраля 2020

readList ожидает ненулевой список аргументов, в который он будет добавлять элементы, поэтому вам нужно инициализировать его перед вызовом readList:

favoritePlaces = mutableListOf<String?>()
`in`.readList(favoritePlaces as List<*>, String::class.java.classLoader)

Или лучше,

favoritePlaces = `in`.createStringArrayList()

Но в Kotlin в принципе нет причин делать это вручную; если возможно, используйте @Parcelize (вам нужно переместить свойства в основной конструктор вместо тела класса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...