我正在尝试创建一个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,这就是我使用接口的原因。
任何人都有任何建议或可能的解决方案吗?
答案 0 :(得分:24)
在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
答案 1 :(得分:8)
实现Parcelable
接口的convention类还必须具有一个非空的静态字段,该字段名为CREATOR
,实现Parcelable.Creator
接口。
您需要使用CREATOR
注释注释@JvmField
属性,以将其公开为包含数据类的公共静态字段。
您还可以查看https://github.com/grandstaish/paperparcel - 一个注释处理器,它自动为Kotlin和Java生成类型安全的Parcelable包装器。