Kotlin接口中的伴随对象

我正在试图做一个接口Parcelable,因此我需要一个这样的接口

interface AB : Parcelable { companion object { val CREATOR : Parcelable.Creator<AB> } } 

和我的两个类A和B看起来像

 data class A (...): Parcelable{ ... companion object { val CREATOR : Parcelable.Creator<AB> = object : Parcelable.Creator<AB> { override fun newArray(size: Int): Array<AB?> { return arrayOfNulls(size) } override fun createFromParcel(parcel: Parcel): AB { return A(parcel) } } } 

我正努力在kotlin中实现这样一个接口。 看来接口类不允许CREATOR

也许我采取了错误的做法,
我有一个parcelable,其中包含A或B类的列表,所以我正在做

 parcel.readTypedList(this.list, AB.CREATOR) 

我要求列表是A或B,这就是为什么我使用一个接口。

任何人有任何建议或可能的解决方案?

在Kotlin中,接口可以有一个companion object但它不是合同的一部分,必须由实现接口的类来实现。 它只是一个与具有一个单例实例的接口相关联的对象。 所以这是一个你可以存储东西的地方,但对实现类没有任何意义。

但是,您可以拥有一个由类的companion object实现的接口。 也许你想要更像这样的东西:

 interface Behavior { fun makeName(): String } data class MyData(val data: String) { companion object: Behavior { // interface used here override fun makeName(): String = "Fred" } } 

请注意,数据类不实现接口,但其companion object

接口上的companion object对于存储与接口有关的常量或辅助函数是很有用的,比如:

 interface Redirector { fun redirectView(newView: String, redirectCode: Int) companion object { val REDIRECT_WITH_FOCUS = 5 val REDIRECT_SILENT = 1 } } // which then can be accessed as: val code = Redirector.REDIRECT_WITH_FOCUS 

按照约定,实现Parcelable接口的类还必须有一个非空的静态字段,称为CREATOR ,它实现了Parcelable.Creator接口。

您需要使用@JvmField批注注释CREATOR属性,以将其公开为包含数据类中的公共静态字段。

你也可以看一下https://github.com/grandstaish/paperparcel-一个注释处理器,它自动为Kotlin和Java生成类型安全的Parcelable包装器&#x3002;