【问题标题】:Kotlin class implementing Java interface errorKotlin 类实现 Java 接口错误
【发布时间】:2018-01-29 17:40:21
【问题描述】:
我有一个 Java 接口
public interface SampleInterface extends Serializable {
Long getId();
void setId(Long id);
}
以及一个应该实现它的 Kotlin 类
open class ClazzImpl() : SampleInterface
private val id: Unit? = null
fun getId(): Long? {
return null
}
fun setId(id: Long?) {
}
但是我得到一个编译错误:
类 ClazzImpl 不是抽象的,也没有实现抽象成员
public abstract fun setId(id: Long!):单位定义在
com....示例接口
有什么想法吗?
【问题讨论】:
标签:
java
class
interface
kotlin
implementation
【解决方案1】:
Egor 和 tynn 的其他答案很重要,但您在问题中提到的错误与他们的答案无关。
你必须先添加花括号。
open class ClazzImpl() : SampleInterface {
private val id: Unit? = null
fun getId(): Long? {
return null
}
fun setId(id: Long?) {
}
}
如果你添加花括号,那个错误就会消失,但你会得到一个像这样的新错误:
'getId' 隐藏超类型 'SampleInterface' 的成员并需要
“覆盖”修饰符
现在,正如其他答案中所建议的,您必须在函数中添加覆盖修饰符:
open class ClazzImpl() : SampleInterface {
private val id: Unit? = null
override fun getId(): Long? {
return null
}
override fun setId(id: Long?) {
}
}
【解决方案2】:
您必须在fun 之前添加override 关键字:
override fun getId(): Long? {
return null
}
override fun setId(id: Long?) {
}
【讨论】:
-
看起来docs 确实非常明确:“[...]我们坚持在 Kotlin 中明确表达。与 Java 不同的是,Kotlin 需要为可覆盖成员显式注释(我们称它们为 open ) 和覆盖[...]"
【解决方案3】:
当你在Kotlin中实现一个接口时,你必须确保重写类体inside的接口方法:
open class ClazzImpl() : SampleInterface {
private var id: Long? = null
override fun getId(): Long? {
return id
}
override fun setId(id: Long?) {
this.id = id
}
}