如何在没有通用构造函数的情况下使继承的类可拆分?

时间:2018-07-18 10:57:57

标签: kotlin

我收到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)
}

3 个答案:

答案 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确实需要一个主要的构造函数来知道该做什么。