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的继承关系:
- 先给父类定义抽象Builder类,并让它继承上层父类的Builder(如果有的话)
- 子类的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
相关产品推荐
相关产品推荐

