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

Lombok @With注解在子类无法作用于抽象父类字段问题咨询

问题原因与解决方案

核心问题

Lombok默认不会自动将父类@With生成的字段修改方法整合到子类中,尤其是父类为抽象类且配合@SuperBuilder使用时,需要调整注解配置才能让子类继承父类字段的withXXX方法能力。

具体修正步骤

1. 移除子类自定义构造函数

你手动编写的Child构造函数会和@SuperBuilder生成的构造逻辑冲突,导致Lombok无法正确处理父类字段的with方法生成,直接删除该自定义构造函数即可。

2. 调整Lombok注解配置

  • 父类保持原有注解不变
  • 子类移除@With注解,添加toBuilder = true到@SuperBuilder中(该配置会让子类自动继承父类@With生成的字段修改能力);同时给@EqualsAndHashCode和@ToString加上callSuper = true,确保父类字段也能参与equals、hashCode和toString逻辑

修正后的代码

父类Parent

@AllArgsConstructor
@Getter
@SuperBuilder
@With
public abstract class Parent {
    protected int c;
}

子类Child

@Getter
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@SuperBuilder(toBuilder = true)
public class Child extends Parent {
    private float a;
    private int b;
}

3. 验证使用方式

现在可以通过子类实例直接调用父类字段的with方法,同时也能修改子类自身字段:

// 创建子类实例
Child child = Child.builder()
        .a(1.0f)
        .b(2)
        .c(3)
        .build();

// 修改父类字段c,生成新的Child实例
Child updatedChild = child.withC(5);
// 修改子类字段a,生成新的Child实例
Child anotherUpdated = updatedChild.withA(2.5f);

4. 确保Lombok版本达标

必须使用Lombok 1.18.16及以上版本,从该版本开始@SuperBuilder才完全支持与@With的配合使用,以及父类字段方法的继承。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:25:37