You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 07:19:28