我有2个班级:
import lombok.Builder;
@Builder
public class B extends A {
}
和
import lombok.Builder;
@Builder
public class A {
}
在@Builder
B
上的我收到了消息:
返回类型与A.builder()不兼容。
这是lombok的限制吗?或者我做错了什么?
如果我将@Builder
关闭A
,则B
上的构建器似乎不会考虑A
的构造函数中B
中的字段}。
答案 0 :(得分:4)
最新的lombok版本1.18.2包含the new experimental @SuperBuilder
。它支持超类(也包括抽象类)的继承和字段。唯一的要求是所有超类都必须具有var n = 4;
var x = [1, 2, 3, 4, 5];
var y = x.reduceRight(function(accumulator, currentValue) {
if (n > 0) { // If n = 0, stop calculating the sum.
accumulator += currentValue;
}
n--; // Reducing n value for every loop.
return accumulator;
}, 0);
console.log(y);
批注。有了它,解决方案就是这样简单:
@SuperBuilder
答案 1 :(得分:3)
只能使用变通方法(See #78)
我们一直在类本身上使用@Builder,但您也可以将它放在类的构造函数或静态方法上。在这种情况下,Lombok将在构造函数/方法的每个参数的构建器类上创建一个setter方法。这意味着您可以使用包含其超类的所有字段的参数创建自定义构造函数。
@AllArgsConstructor
public class Parent {
private String a;
}
public class Child extends Parent {
private String b;
@Builder
private Child(String a, String b){
super(a);
this.b = b;
}
}
答案 2 :(得分:1)
我无法重现你的确切问题,但这可能是因为龙目岛已经进化了。
然而,部分问题是,be的构建器不包含a的字段。这仍然是正确的,@AllArgsConstructor
也是如此。继承不是龙目岛的强项。
Thad说,因为您可以自己编写构造函数并将@Builder
放在构造函数上,所以下面将按照您的意愿生成B的构建器:
@Builder
public class A {
String a;
}
public class B extends A {
@Builder
B(String a, String b) {
super(a);
this.b = b;
}
String b;
}
答案 3 :(得分:0)
使用带有Java继承功能的lombok面临的问题,在父类和子类上使用以下注释后已解决:
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@数据
@AllArgsConstructor
@NoArgsConstructor
答案 4 :(得分:-1)
在不知道lombok的实现细节或尝试它的情况下我会说不,因为模式不会允许它。
如果实现构建器模式,则所有方法(build()除外)将始终具有构建器所在的类作为返回类型。
这意味着A类的方法只返回A.所以B总是返回B. 如果现在让B从A扩展它将不会覆盖A的方法,因为它的返回类型不匹配。反之亦然,它不能在B中实现构建器方法,因为这些方法已经存在于A中。它们不能通过OOP设计共存。
您可以创建通用构建器,但这不能解决问题。如果你真的需要从A扩展,你的问题可能来自另一个设计决策,而构建模式无法解决。
我认为不是扩展类,而是在构建器中有lombok应该支持的默认值。然后,这些默认值反映了A类默认支持的内容。在一个用例中,你宁愿让B做东西,然后调用构建器方法并覆盖这些默认值。
编辑:哦,也许have a look here