【问题标题】: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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-08
        • 2021-01-29
        • 1970-01-01
        • 1970-01-01
        • 2019-12-26
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多