创建一个Parcelable类与一个辅助构造函数,该函数将一个列表作为Kotlin中的参数
我开始使用Kotlin并尝试实现一个可接受的对象,该对象接收字符串列表作为辅助构造函数的参数。然而,我发现了错误:创建一个Parcelable类与一个辅助构造函数,该函数将一个列表作为Kotlin中的参数
Cannot access '< this >' before super class constructor has been called
这里是我的代码:
class StringChecker(val stringList : List<String>) : Parcelable { var mStringList = stringList
constructor(parcel: Parcel) : this(parcel.readStringList(mStringList))
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeStringList(mStringList)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<StringChecker> {
override fun createFromParcel(parcel: Parcel): StringChecker {
return StringChecker(parcel)
}
override fun newArray(size: Int): Array<StringChecker?> {
return arrayOfNulls(size)
}
}
}
我明白,我不能创建对象之前调用成员变量mStringList和那当然是有道理的,但是readStringList方法需要一个字符串列表参数。我该如何解决这个问题?这是我的设计parcelable vs采取list作为构造参数的问题?
回答:
您不能在二级构造函数中使用字段。使用createStringArrayList()
代替readStringList(mStringList)
constructor(parcel: Parcel) : this(parcel.createStringArrayList())
回答:
对于这个特定的情况下,你可以把它写成
constructor(parcel: Parcel) : this(mutableListOf<String>()) { parcel.readStringList(mStringList)
}
但我宁愿只是为了让一个工厂方法,而不是一个构造函数。特别是因为你无论如何都需要它来用于工厂方法。即:
companion object CREATOR : Parcelable.Creator<StringChecker> { override fun createFromParcel(parcel: Parcel): StringChecker {
val stringList = mutableListOf<String>()
parcel.readStringList(stringList)
return StringChecker(stringList)
}
override fun newArray(size: Int): Array<StringChecker?> {
return arrayOfNulls(size)
}
}
更多一些:你可能不希望同时拥有stringList
和mStringList
属性,你的代码目前一样。如果它需要是var
,则只需执行class StringChecker(var stringList : List<String>)
。也看看@Parcelize
。
以上是 创建一个Parcelable类与一个辅助构造函数,该函数将一个列表作为Kotlin中的参数 的全部内容, 来源链接: utcz.com/qa/263597.html