Kotlin 数据 class 实现 Java 接口

Kotlin data class implementing Java interface

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

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();  
}

但出于某种原因,编译器不理解该方法已经实现:

Class 'Video' must be declared abstract or implement abstract member public abstract fun getId(): kotlin.Long! defined in net.alfad.data.Entity

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

这里的问题是 Kotlin 首先加载 Java class Entity 并且它将 getId 视为函数,而不是 getter一些 属性。 Kotlin class 中的 属性 getter 无法覆盖函数,因此 属性 id 未绑定为 getId 函数的实现.

要解决此问题,您应该覆盖 Kotlin class 中的原始函数 getId。这样做会导致新函数和字节码中 id 的 getter 之间的 JVM 签名冲突,因此您还应该通过使 属性 private:

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

    ...
}

请注意,此答案改编自此处:

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

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