Kotlin继承Java抽象类时id属性与getId抽象方法冲突问题问询
冲突产生的核心原因
Java抽象父类定义的public abstract Integer getId()方法,在Kotlin编译环境中会被识别为返回平台类型Int!的抽象方法。Kotlin类中定义名为id的属性时,编译器会自动生成对应签名的getId()/setId()方法,与父类方法的JVM签名匹配,因此会先后出现未实现抽象方法、意外重写的冲突。
可行解决方案
方案1:显式标记属性重写(最简洁,适合id属性直接对应父类返回值的场景)
直接在主构造器的id属性前添加override关键字,明确告知编译器该属性的getter即为父类抽象方法的实现:class Child(override var id: Int? = null) : Base()方案2:修改自定义属性的getter签名,手动实现父类方法(适合需要保留id为公开属性、且需自定义getId逻辑的场景)
给id属性添加@JvmName注解修改其getter的JVM方法名,避免和父类方法签名冲突,再手动重写父类的getId()方法:class Child() : Base() { @get:JvmName("getInnerId") var id: Int? = null override fun getId(): Int? { // 可自定义返回逻辑 return id } }方案3:将内部id属性设为私有(适合id为类内部私有字段、不需要对外暴露的场景)
私有属性的getter不会生成公开方法,不会和父类的公开抽象方法冲突,再手动重写父类方法即可:class Child() : Base() { private var id: Int? = null override fun getId(): Int? { return id } }
内容的提问来源于stack exchange,提问作者aarbor
相关产品推荐
相关产品推荐

