首页 文章

Kotlin数据类实现Java接口

提问于
浏览 1660 次
23

我正在尝试将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 param使用任何其他关键字?什么“!”签名意味着什么?

2 回答

  • 34

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

    要解决此问题,您应该覆盖Kotlin类中的原始函数 getId . 这样做会导致新函数与字节码中的getter之间的JVM签名冲突,因此您还应该通过使属性 private 阻止编译器生成getter:

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

    请注意,此答案已从此处改编:https://stackoverflow.com/a/32971284/288456

  • 1

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

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

相关问题