我开始使用Kotlin并尝试实现一个可接受的对象,该对象接收一个字符串列表作为辅助构造函数的参数。但是,我收到错误:
在调用超类构造函数之前无法访问“<this>”
这是我的代码:
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与将列表作为构造函数参数的问题吗?
对于这种特定情况,您可以将其写为
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
。
您不能在辅助构造函数中使用字段。使用createStringArrayList()
而不是readStringList(mStringList)
constructor(parcel: Parcel) : this(parcel.createStringArrayList())