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

Lombok @SuperBuilder抽象类调用toBuilder报错,是否需转具体类?

问题原因与解决方案

为什么会报错?

抽象类A虽然加了@SuperBuilder(toBuilder = true),但Lombok默认不会给抽象类生成公共的toBuilder()方法,所以父类型引用aObj编译时找不到这个方法。

最优解决方案:给抽象类添加抽象的toBuilder方法

不需要强制转换为具体类,只需要在抽象类A中定义一个抽象的toBuilder()方法,Lombok会自动让子类的Builder实现这个方法,这样父类引用就能正常调用:

@Getter
@SuperBuilder(toBuilder = true)
@ToString
@NoArgsConstructor
abstract class A {
   String a;
   // 新增抽象方法,让子类自动实现
   abstract ABuilder<?, ?> toBuilder();
}

@Getter
@SuperBuilder(toBuilder = true)
@ToString
@AllArgsConstructor
class B extends A {
  String b;
}

public A setAField(final A aObj, final String setA) {
  return aObj.toBuilder().a(setA).build();
}

关于强制转换的问题

如果实在不想修改抽象类,确实可以强制转换为具体类(比如((B)aObj).toBuilder()),但这种写法非常不推荐:

  • 代码耦合具体子类,违背了抽象设计的初衷
  • 如果后续新增其他继承A的子类(比如C),这个方法传入C类型的对象就会抛出类型转换异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 14:13:41