如何结合泛型与@SuperBuilder将通用逻辑复用至父类构建器?
解决Lombok @SuperBuilder泛型构建器的类型安全问题
问题场景
两个继承自同一父类的DTO,使用Lombok的@SuperBuilder实现建造者模式,需要将通用逻辑抽离到commonize方法中,同时保证类型安全,避免强制类型转换。
修改后的完整可运行代码
DTO类定义
import lombok.Getter; import lombok.experimental.SuperBuilder; @Getter @SuperBuilder public class ParentDto { private String commonField; } @Getter @SuperBuilder public class ChildDto1 extends ParentDto { private String childField1; } @Getter @SuperBuilder public class ChildDto2 extends ParentDto { private String childField2; }
工具类(含通用方法与测试)
public class BuilderUtil { // 修改后的泛型定义,实现类型安全 public static <T extends ParentDto, B extends ParentDto.ParentDtoBuilder<T, B>> B commonize(B builder) { builder.commonField("通用字段值"); // 可在此添加更多通用构建逻辑 return builder; } public static void testGeneric() { // 编译无错误,支持链式调用子类建造器方法 ChildDto1 dto1 = commonize(ChildDto1.builder()).childField1("子字段1").build(); ChildDto2 dto2 = commonize(ChildDto2.builder()).childField2("子字段2").build(); System.out.println(dto1.getCommonField()); System.out.println(dto2.getCommonField()); } public static void main(String[] args) { testGeneric(); } }
泛型定义解释
- 泛型参数
T extends ParentDto:限定最终构建的DTO必须是ParentDto的子类,明确目标类型 - 泛型参数
B extends ParentDto.ParentDtoBuilder<T, B>:匹配Lombok生成的建造器递归泛型结构,确保传入和返回的建造器类型完全一致,支持后续链式调用子类专属方法
关键原理
Lombok的@SuperBuilder会生成带递归泛型的建造器类:ParentDtoBuilder<T extends ParentDto, B extends ParentDtoBuilder<T, B>>,子类建造器会继承该结构并替换为自身类型参数。通过在commonize方法中匹配这个泛型结构,编译器能自动推导正确的建造器类型,实现类型安全的通用逻辑复用。
内容的提问来源于stack exchange,提问作者Antoniossss
相关产品推荐
相关产品推荐

