如何解决Lombok @SuperBuilder继承后链式调用断裂问题?
解决Lombok父子类Builder链式调用中断问题
当父类使用@Builder、子类用@SuperBuilder实现继承时,父类自动生成的Builder方法会返回父类Builder类型,导致先调用父类方法再调用子类方法时链式调用直接中断——比如DetailedActivityBuilder.builder().foo().platform(...)会编译失败,因为foo()返回的ActivityBuilder没有platform()方法。
核心解决方案
把父类的@Builder替换为@SuperBuilder即可。@SuperBuilder是Lombok专门为继承场景设计的注解,原生支持泛型协变的Builder类型推导,能让父类所有自动生成和自定义的Builder方法,都自动返回子类Builder类型,完全适配任意顺序的链式调用。
修改后的完整代码
父类Activity
@SuperBuilder public class Activity { protected String foo; protected String bar; // 自定义Builder方法需遵循@SuperBuilder的泛型规范 public static abstract class ActivityBuilder<C extends Activity, B extends ActivityBuilder<C, B>> { public B baz(String baz) { // 自定义逻辑示例:用baz值生成foo this.foo(baz + "_suffix"); return self(); } // 必须实现self()方法,子类Builder会重写它返回自身实例 protected abstract B self(); } }
子类DetailedActivity
@SuperBuilder public class DetailedActivity extends Activity { // 可添加子类专属字段(示例中省略) public static abstract class DetailedActivityBuilder<C extends DetailedActivity, B extends DetailedActivityBuilder<C, B>> extends ActivityBuilder<C, B> { public B platform(Platform platform) { this.foo(platform.getFoo()); this.bar(platform.getBar()); return self(); } } // 示例Platform类 public static class Platform { private String foo; private String bar; public String getFoo() { return foo; } public void setFoo(String foo) { this.foo = foo; } public String getBar() { return bar; } public void setBar(String bar) { this.bar = bar; } } }
验证链式调用
现在两种调用顺序都能正常编译执行:
DetailedActivity.Platform platformData = new DetailedActivity.Platform(); platformData.setFoo("test_foo"); platformData.setBar("test_bar"); // 顺序1:先子类方法,再父类方法 DetailedActivity activity1 = DetailedActivity.builder() .platform(platformData) .baz("custom_baz") .bar("override_bar") .build(); // 顺序2:先父类方法,再子类方法 DetailedActivity activity2 = DetailedActivity.builder() .foo("init_foo") .baz("custom_baz") .platform(platformData) .build();
原理说明
@SuperBuilder要求父类Builder定义两个泛型参数:C代表最终构建的实体类型(子类),B代表Builder自身的类型(子类Builder)。- 父类所有Builder方法(包括自动生成的
foo()、bar()和自定义的baz())都返回B类型,子类Builder通过重写self()方法返回自身实例,保证链式调用的类型一致性。 - Lombok自动生成的代码会自动适配泛型,不需要手动修改生成方法的返回类型,彻底解决了之前手动泛型只能修复自定义方法的问题。
内容的提问来源于stack exchange,提问作者helion3
相关产品推荐
相关产品推荐

