2017-12-18 209 views
0

我开始使用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作为构造参数的问题?

回答

1

您不能在二级构造函数中使用字段。使用createStringArrayList()代替readStringList(mStringList)

constructor(parcel: Parcel) : this(parcel.createStringArrayList()) 
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) 
    } 
} 

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

+0

它很有意义。会试试这个。 – alexm

相关问题