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

如何结合泛型与@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();
    }
}

泛型定义解释

  1. 泛型参数T extends ParentDto:限定最终构建的DTO必须是ParentDto的子类,明确目标类型
  2. 泛型参数B extends ParentDto.ParentDtoBuilder<T, B>:匹配Lombok生成的建造器递归泛型结构,确保传入和返回的建造器类型完全一致,支持后续链式调用子类专属方法

关键原理

Lombok的@SuperBuilder会生成带递归泛型的建造器类:ParentDtoBuilder<T extends ParentDto, B extends ParentDtoBuilder<T, B>>,子类建造器会继承该结构并替换为自身类型参数。通过在commonize方法中匹配这个泛型结构,编译器能自动推导正确的建造器类型,实现类型安全的通用逻辑复用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:05:19