尝试在包含空字段的 ArrayList 变量上使用 parcelable 时获取 kotlin.TypeCastException

Getting kotlin.TypeCastException when trying to use parcelable on an ArrayList variable which contains null fields

我昨天才真正开始使用 Kotlin,所以我仍然很难理解其基本原理。我想通过意图将一个对象发送到另一个 activity 并在对象上实现 parcelable。该对象包含以下形式的一些 MutableLists:

var favoritePlaces: MutableList<String?>? = null

我使用了这个方法构造函数来打包它:

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

这是我在 Android Studio 中遇到的错误,因为存在类型不匹配:

我尝试采纳 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: Unable to start activity ComponentInfo{com.test.app.Activity}: kotlin.TypeCastException: null cannot be cast to non-null type kotlin.collections.List<*>

我确实知道 kotlin.collections.List<*> 类型是非空类型,并且由于我的数组中有一些空字段,所以出现此错误是有道理的。我现在的问题是,如何在 Kotlin 中使用非空字段和空字段来分割字符串数组???

readList 需要一个非空参数列表,它将向其中添加元素,因此您需要在调用 readList 之前对其进行初始化:

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

或者更好,

favoritePlaces = `in`.createStringArrayList()

但在 Kotlin 中,基本上没有理由手动执行此操作;如果可能,请使用 @Parcelize(您需要将属性移动到主构造函数而不是 class 主体)。