gpt4 book ai didi

java - Kotlin 数据类实现 Java 接口(interface)

转载 作者:IT老高 更新时间:2023-10-28 13:28:24 32 4
gpt4 key购买 nike

我正在尝试将 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接口(interface):

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 类 Entity,它把 getId 看作一个函数,而不是某个属性的 getter。 Kotlin 类中的属性 getter 无法覆盖函数,因此属性 id 未绑定(bind)为 getId 函数的实现。

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

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

...
}

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

关于java - Kotlin 数据类实现 Java 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35631290/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com