我收到PhoneAppItem
的以下错误:
Parcelable应该具有主要构造函数
我该如何解决?我有一个带有不共享基本构造函数的构造函数的基类,那么如何扩展此类并使其在Kotlin中可拆分?
想法
PhoneAppItem
中的次要构造函数未调用主要构造函数,IDE表示以下内容:主要构造函数调用
代码
这是产生此错误的基本准系统代码(我有两个以上的简单构造函数!):
abstract class AbstractPhoneAppItem : Parcelable {
constructor() {
}
constructor(packageName: String?) {
this.packageName = packageName
}
}
@Parcelize
class PhoneAppItem : AbstractPhoneAppItem {
constructor() : super()
constructor(packageName: String?) : super(packageName)
}
答案 0 :(得分:1)
您正在使用哪个版本的Kotlin?您是否尝试过:
abstract class AbstractPhoneAppItem(): Parcelable {
private var packageName: String? = null
constructor(packageName: String?): this() {
this.packageName = packageName
}
}
@Parcelize
class PhoneAppItem : AbstractPhoneAppItem {
constructor() : super()
constructor(packageName: String?) : super(packageName)
}
答案 1 :(得分:0)
您可以使用可选参数创建主要构造函数:
abstract class AbstractPhoneAppItem (var packageName: String? = null) : Parcelable {
}
这样,您可以在没有任何参数的情况下使用它(因此packageName为null或所需的默认值)或将其与参数一起使用。然后,您的项目类可以调用超类的主要构造函数。
答案 2 :(得分:0)
您必须使用custom parceler:
@Parcelize
class PhoneAppItem : AbstractPhoneAppItem {
constructor() : super()
constructor(packageName: String?) : super(packageName)
companion object : Parceler<PhoneAppItem> {
// modify logic to taste
override fun PhoneAppItem.writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(packageName)
}
override fun create(parcel: Parcel): PhoneAppItem {
return PhoneAppItem(parcel.readString())
}
}
}
否则,@Parcelize
确实需要一个主要的构造函数来知道该做什么。