是否可以在Kotlin界面中指定一个静态函数?

我想要做这样的事情:

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任何东西都不能是abstractopen (因此被重写),也没有办法要求实现的companion object具有方法,或者在接口中定义/需要构造器。

你可能的解决方案是将这两个函数分成两个接口:

 interface Serializable<ToType> { fun serialize(): ToType } interface Deserializer<FromType, ToType> { fun deserialize(serialized: ToType): FromType } 

这样,您将能够在类中实现第一个接口,并使其companion object实现另一个接口:

 class C: Serializable<String> { override fun serialize(): String = "..." companion object : Deserializer<C, String> { override fun deserialize(serialized: String): C = C() } } 

此外,还有一个严重的局限性, 只有一个类型的泛型专用化可以用作超类型 ,所以这种通过接口实现序列化的模型可能变得不够可扩展,不允许具有不同ToType的多个实现。

我对Kotlin比较陌生。 这是我的2¢

  1. 伴侣对象是一个类的实例,因此不能被继承。 这就是为什么抽象函数无法实现的地方。 在Java中,类似的结果需要匿名类实现抽象类,但是与类的实例的重载方法有很大不同。

  2. 接口不能用来创建实例,所以在接口中对构造函数没有用处。

你为什么不创建通用的抽象类? 然后抽象或打开函数将工作serialize():ToType和反序列化(序列化:ToType):FromType函数。