实现 Java 接口的 Kotlin 数据类

2022-09-01 08:46:52

我试图将Kotlin引入到我目前的项目中。我决定从实体开始,它们似乎完美地映射到数据类。例如,我有一个数据类:

data class Video(val id: Long, val ownerId: Long, val title: String, val description: String? = null,
             val imgLink: String? = null, val created: Date? = null, val accessKey: String? = null,
             val views: Long? = null, val comments: Long? = null, val videoLink: String? = null): Entity

它实现了Java接口:

public interface Entity {
   Long getId();  
}

但是由于某种原因,编译器不明白该方法已经实现:

类'Video'必须声明为抽象或实现抽象成员公共抽象fun getId():kotlin。长!在 net.alfad.data.Entity 中定义

我是否必须为 id 参数使用任何其他关键字?签名中的“!”是什么意思?


答案 1

这里的问题是,Kotlin 首先加载 Java 类,它将其视为一个函数,而不是某个属性的获取者。Kotlin 类中的属性 getter 不能重写函数,因此该属性不绑定为函数的实现。EntitygetIdidgetId

要解决此问题,您应该重写 Kotlin 类中的原始函数。这样做会导致新函数与字节码中的 getter 之间的 JVM 签名冲突,因此您还应该通过使属性:getIdidprivate

data class Video(
    private val id: Long,
    ...
): Entity {
    override fun getId() = id

    ...
}

请注意,这个答案是从这里改编的:https://stackoverflow.com/a/32971284/288456


答案 2

如果这是你的整个数据类,那么你就不会覆盖getId()。我看到你有一个名为id的属性,Kotlin应该为此生成一个getter,但它不会用overedical关键字标记,你需要指示你正在覆盖一个抽象函数。

- 编辑 - 亚历山大打败了我!无论如何,他的答案更好!;)


推荐