2017-12-18 29 views
0

私はKotlinを使い始めており、セカンダリコンストラクタのパラメータとして文字列のリストを受け取るパーセルブルオブジェクトを実装しようとしています。しかし、私はエラーを取得しています:ここKotlinでパラメータとしてリストを受け取るセカンダリコンストラクタを持つParcelableクラスを作成する

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メソッドには文字列リストパラメータが必要です。この問題を解決するにはどうすればよいですか?これは私の設計の問題ですか?コンストラクターパラメーターとしてリストを取っているのですか?

答えて

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

関連する問題