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

Lombok Builder继承报错:CEntity.builder()无法重写BEntity.builder()

Lombok Builder继承冲突问题解决方案

编译报错的核心原因是:继承链中的子类用@Builder生成的builder()方法,返回类型是子类自己的Builder类(比如CEntityBuilder),但父类的builder()返回的是父类的Builder类(比如BEntityBuilder),Java中方法覆盖要求返回类型兼容(要么相同要么是子类),但Lombok默认生成的这两个Builder类没有继承关系,所以触发编译错误。

下面给两种可行的解决办法:

方法一:用@SuperBuilder替代@Builder(推荐)

Lombok从1.18.4版本开始提供了@SuperBuilder注解,专门解决继承场景下的Builder兼容问题,用法比手动处理简单得多。

只需要把继承链上所有实体类的@Builder替换成@SuperBuilder即可:

@SuperBuilder
public class AEntity {
    private String aProp;
}

@SuperBuilder
public class BEntity extends AEntity {
    private String bProp;
}

@SuperBuilder
public class CEntity extends BEntity {
    private String cProp;
}

使用时可以链式设置所有父类和子类的属性:

CEntity entity = CEntity.builder()
        .aProp("a值")
        .bProp("b值")
        .cProp("c值")
        .build();

方法二:手动自定义Builder继承(适配低版本Lombok)

如果你的Lombok版本低于1.18.4,只能手动处理Builder的继承关系:

  1. 先给父类定义抽象Builder类,并让它继承上层父类的Builder(如果有的话)
  2. 子类的Builder继承父类的Builder,同时通过@Builder的参数指定自定义的Builder类

示例代码:

// AEntity
@Builder(builderClassName = "AEntityBuilder")
public class AEntity {
    protected String aProp;

    public abstract static class AEntityBuilder<C extends AEntity, B extends AEntityBuilder<C, B>> {
        protected String aProp;

        public B aProp(String aProp) {
            this.aProp = aProp;
            return self();
        }

        protected abstract B self();

        public abstract C build();
    }
}

// BEntity
@Builder(builderClassName = "BEntityBuilder", builderMethodName = "bBuilder")
public class BEntity extends AEntity {
    protected String bProp;

    public abstract static class BEntityBuilder<C extends BEntity, B extends BEntityBuilder<C, B>> extends AEntityBuilder<C, B> {
        protected String bProp;

        public B bProp(String bProp) {
            this.bProp = bProp;
            return self();
        }
    }
}

// CEntity
@Builder(builderClassName = "CEntityBuilder", builderMethodName = "builder")
public class CEntity extends BEntity {
    private String cProp;

    public static class CEntityBuilder extends BEntityBuilder<CEntity, CEntityBuilder> {
        private String cProp;

        public CEntityBuilder cProp(String cProp) {
            this.cProp = cProp;
            return self();
        }

        @Override
        protected CEntityBuilder self() {
            return this;
        }

        @Override
        public CEntity build() {
            CEntity entity = new CEntity();
            entity.aProp = this.aProp;
            entity.bProp = this.bProp;
            entity.cProp = this.cProp;
            return entity;
        }
    }
}

这种方式需要手动实现Builder的继承、self()方法和build()方法,确保链式调用返回子类Builder,同时可以通过调整builderMethodName避免父类和子类的builder方法冲突。另外要注意把父类属性设为protected,让子类Builder能正常访问。

内容的提问来源于stack exchange,提问作者noob234

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 20:15:13