Java子类如何为Kotlin基类的protected字段添加公共Getter?
解决Kotlin基类protected val在Java子类暴露公共Getter的编译错误
错误原因
Kotlin中用val声明的属性,编译器会自动生成对应的getProp() getter方法,且该方法默认是final的。同时因为基类中prop是protected修饰,自动生成的getter可见性也是protected。Java子类尝试重写这个final方法时就会触发编译错误。另外你的Java代码误用了Kotlin的Int类型,Java中应使用Integer或int。
解决方案
方案一:修改Kotlin基类,允许重写getter
将基类属性的getter设置为open,让生成的getter不再是final,Java子类就能重写它并提升可见性为public:
修改后的Kotlin基类:
abstract class Base(protected open val prop: Int) { // ... }
对应的Java子类:
public class Impl extends Base { public Impl(int prop) { super(prop); } @Override public Integer getProp() { return super.getProp(); } }
如果不想让属性本身可重写,仅开放getter的重写权限,可以这样定义基类:
abstract class Base(protected val prop: Int) { protected open val propValue: Int get() = prop }
之后Java子类重写getPropValue()并改为public即可。
方案二:不修改Kotlin基类,定义新的公共Getter方法
直接在Java子类中创建名称不同的公共方法,绕过重写final方法的限制:
public class Impl extends Base { public Impl(int prop) { super(prop); } public Integer getProperty() { return prop; } }
外部调用方通过getProperty()就能获取prop的值,无需修改原有Kotlin基类。
内容的提问来源于stack exchange,提问作者dave mankoff
相关产品推荐
相关产品推荐

