Kotlin数据类实现Java接口

我正在尝试将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(); } 

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

类“视频”必须声明为抽象或实现抽象成员公共抽象乐趣getId():kotlin.Long! 在net.alfad.data.Entity中定义

我必须使用任何额外的关键字ID参数? 什么“!” 意味着在签名?

这里的问题是,Kotlin首先加载Java类Entity ,它将getId看作一个函数,而不是某个属性的getter。 Kotlin类中的属性获取器不能重写某个函数,因此属性id没有被绑定为getId函数的实现。

为了解决这个问题,你应该重写你的Kotlin类的原始函数getId 。 这样做会导致JVM签名在新的函数和id的getter之间发生冲突,因此您还应该通过使属性private防止编译器生成getter:

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

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

如果这是你的整个数据类,那么你不重写getId()。 我发现你有一个名为id的属性,Kotlin应该为它生成一个getter,但是不会用override关键字来标记,你需要指明你正在重写一个抽象函数。

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