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