是否可以在 Kotlin 接口中指定静态函数?
Is it possible to specify a static function in a Kotlin interface?
我想做这样的事情:
interface Serializable<FromType, ToType> {
fun serialize(): ToType
companion object {
abstract fun deserialize(serialized: ToType): FromType
}
}
甚至这对我也有用:
interface Serializable<ToType> {
fun serialize(): ToType
constructor(serialized: ToType)
}
但都无法编译。 有这方面的语法吗,或者我会被迫使用使其成为工厂的接口吗? 或者有其他答案吗?那太好了!
基本上,companion object
中的任何内容都不能是 abstract
或 open
(因此会被覆盖),并且无法要求实现的 companion object
s在接口中有一个方法或define/require一个构造函数。
一个可能的解决方案是将这两个函数分成两个接口:
interface Serializable<ToType> {
fun serialize(): ToType
}
interface Deserializer<FromType, ToType> {
fun deserialize(serialized: ToType): FromType
}
这样,您将能够在 class 中实现第一个接口并使其 companion object
实现另一个接口:
class C: Serializable<String> {
override fun serialize(): String = "..."
companion object : Deserializer<C, String> {
override fun deserialize(serialized: String): C = C()
}
}
此外, 有一个严格的限制,因此这种通过接口实现序列化的模型可能无法扩展,不允许具有不同 ToType
s 的多个实现。
我想做这样的事情:
interface Serializable<FromType, ToType> {
fun serialize(): ToType
companion object {
abstract fun deserialize(serialized: ToType): FromType
}
}
甚至这对我也有用:
interface Serializable<ToType> {
fun serialize(): ToType
constructor(serialized: ToType)
}
但都无法编译。 有这方面的语法吗,或者我会被迫使用使其成为工厂的接口吗? 或者有其他答案吗?那太好了!
基本上,companion object
中的任何内容都不能是 abstract
或 open
(因此会被覆盖),并且无法要求实现的 companion object
s在接口中有一个方法或define/require一个构造函数。
一个可能的解决方案是将这两个函数分成两个接口:
interface Serializable<ToType> {
fun serialize(): ToType
}
interface Deserializer<FromType, ToType> {
fun deserialize(serialized: ToType): FromType
}
这样,您将能够在 class 中实现第一个接口并使其 companion object
实现另一个接口:
class C: Serializable<String> {
override fun serialize(): String = "..."
companion object : Deserializer<C, String> {
override fun deserialize(serialized: String): C = C()
}
}
此外,ToType
s 的多个实现。