创建一个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)

}

}

更多一些:你可能不希望同时拥有stringListmStringList属性,你的代码目前一样。如果它需要是var,则只需执行class StringChecker(var stringList : List<String>)。也看看@Parcelize

以上是 创建一个Parcelable类与一个辅助构造函数,该函数将一个列表作为Kotlin中的参数 的全部内容, 来源链接: utcz.com/qa/263597.html

回到顶部