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
相关产品推荐
相关产品推荐

