Android Kotlin接口中的伴生对象

Android Kotlin接口中的伴生对象,android,parcelable,kotlin,Android,Parcelable,Kotlin,我正在尝试使一个接口可打包,因此我需要这样一个接口 interface AB : Parcelable { companion object { val CREATOR : Parcelable.Creator<AB> } } 我要求列表为A或B,这就是我使用接口的原因 任何人都有任何建议或可能的解决方案吗?通过实现Parcelable接口的类,还必须具有一个名为CREATOR的非空静态字段,该字段的类型实现Parcelable.CREATOR接口

我正在尝试使一个接口可打包,因此我需要这样一个接口

interface AB : Parcelable {
    companion object {
        val CREATOR : Parcelable.Creator<AB>
    }
}
我要求列表为A或B,这就是我使用接口的原因

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

通过实现
Parcelable
接口的类,还必须具有一个名为
CREATOR
的非空静态字段,该字段的类型实现
Parcelable.CREATOR
接口

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


另外,您还可以看看一个注释处理器,它自动为Kotlin和Java生成类型安全的可打包包装器

在Kotlin中,接口可以具有,但它不是必须由实现接口的类实现的契约的一部分。它只是一个与具有一个单例实例的接口关联的对象。因此,它是一个可以存储东西的地方,但对实现类来说没有任何意义

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

interface Behavior {
   fun makeName(): String
}

data class MyData(val data: String) {
    companion object: Behavior {  // interface used here
        override fun makeName(): String = "Fred"
    }
}
请注意,数据类不实现接口,但它的
伴生对象实现接口

接口上的
伴生对象
可用于存储与接口相关的常量或辅助函数,例如:

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

如果您遇到特定的编译错误,请发布错误。谢谢大家的帮助,我认为我没有很好地描述我的问题。无论如何,我按照这个答案解决了这个问题,并将java重写为kotlin。工作正常,只是我不再使用数据类。我试过ParcelPaper,但它在过去对我不起作用,它被允许有泛型约束,比如“任何有一个实现Xyz的伴生对象的类”,这些约束在Kotlin早期就消失了,希望将来能作为另一种泛型约束重新出现。然后你可以一般地一起讨论一个类和它的同伴。我想这仍然是Kotlin 4/13/17的情况吗?@AdamHughes你指的是包括同伴对象的一般约束吗?如果是这样的话,我认为他们还没有回来。杰森,我指的是将一个伴生对象放入一个接口中,正如你在这个答案的最后一段代码中所显示的那样。我认为你的答案的第一部分没有帮助。第二部分本身很有用。@JaysonMinard在这种情况下,它需要满足包裹约定,我编辑了答案来解释原因。非常感谢,它是否也需要是
JvmStatic
,或者
JvmField
在同伴对象中也需要这样做?@JaysonMinard否,
JvmStatic
用于方法。这是最近在文档中排序的:@JvmField似乎在接口的伴生对象中不起作用。你有没有想过为什么会这样?
interface Behavior {
   fun makeName(): String
}

data class MyData(val data: String) {
    companion object: Behavior {  // interface used here
        override fun makeName(): String = "Fred"
    }
}
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