我有这样的Java parcelable:
@SuppressWarnings("rawtypes")
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public KwerendaGraficzna createFromParcel(Parcel in) {
return new KwerendaGraficzna(in);
}
public KwerendaGraficzna[] newArray(int size) {
return new KwerendaGraficzna[size];
}
};
现在尝试在Kotlin中实现它:
companion object {
@SuppressWarnings("rawtypes")
val CREATOR: Parcelable.Creator<KwerendaGraficzna!> = object : Parcelable.Creator<KwerendaGraficzna!> {
override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
return KwerendaGraficzna(`in`)
}
override fun newArray(size: Int): Array<KwerendaGraficzna!> {
return arrayOfNulls<KwerendaGraficzna!>(size)
}
}
}
arrayOfNulls
在声明已收到KwerendaGraficzna
时需要KwerendaGraficzna?
才会进行编译
那我该怎么办?
答案 0 :(得分:15)
我怀疑你使用过时版本的Kotlin编译器(因为你使用!
)。这是一个使用最新版本正确编译的版本:
companion object {
@JvmField
val CREATOR = object : Parcelable.Creator<KwerendaGraficzna> {
override fun createFromParcel(`in`: Parcel): KwerendaGraficzna {
return KwerendaGraficzna(`in`)
}
override fun newArray(size: Int): Array<KwerendaGraficzna?> {
return arrayOfNulls(size)
}
}
}
由于Parcelable.Creator
需要公开的静态字段,我们需要使用@JvmField
和JvmStatic
标记CREATOR
属性。
答案 1 :(得分:0)
在1.1.4
中使用Kotlin Android Extensions,您可以使用@Parcelize
注释来摆脱createFromParcel()
方法
您应该在build.gradle
androidExtensions {
experimental = true
}
例如,您的课程可能看起来像
@Parcelize
class Model(val title: String, val amount: Int) : Parcelable
在此处阅读更多内容 - https://antonioleiva.com/kotlin-android-extensions/
答案 2 :(得分:0)
您不需要实现所有样板代码。
相反,
@Parcelize
data class KwerendaGraficzna(val a: Int, val b: String): Parcelable{
// TODO: others code
}
就是这样。
您需要在experimental
中启用true
至build.gradle
才能应用上述方法。
android{
compileSdkVersion 30
defaultConfig{
applicationId "com.example"
minSdkVersion 25
targetSdkVersion 30
...
}
...
androidExtensions {
experimental = true
}
}