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关键字来标记,你需要指明你正在重写一个抽象函数。
– 编辑 – 亚历山大击败了我! 无论如何,他的回答是更好的! ;)