Java Lombok Builder不工作
我有一个基础班Java Lombok Builder不工作,java,lombok,Java,Lombok,我有一个基础班 @Getter @Setter @AllArgsConstructor @NoArgsConstructor @Builder public class FurnitureBillingRequest implements JSONAble<FurnitureBillingRequest> { private static final Gson gsonSerializer; static { gsonSerializer = ne
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class FurnitureBillingRequest implements JSONAble<FurnitureBillingRequest> {
private static final Gson gsonSerializer;
static {
gsonSerializer = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
}
@Expose
protected String name;
@Expose
protected long date;
@Expose
protected String phone;
@Expose
protected List<BillItemRO> items;
@Expose
protected int totalAmount;
@Expose
protected int amountPaid;
@Expose
protected String remark;
@Expose
protected String address;
public FurnitureBillingRequest(String name, long date, String phone, int totalAmount,
int amountPaid, String remark, String address) {
this(name, date, phone, new ArrayList<>(), totalAmount, amountPaid, remark, address);
}
public String toJson() {
return gsonSerializer.toJson(this);
}
public FurnitureBillingRequest toObject(String json) {
return gsonSerializer.fromJson(json, FurnitureBillingRequest.class);
}
@Override
public boolean equals(Object that) {
if (!(that instanceof FurnitureBillingRequest)) {
return false;
}
FurnitureBillingRequest thatFurnitureBillingRequest = (FurnitureBillingRequest) that;
if (!StringUtils.equals(this.name, thatFurnitureBillingRequest.name)) return false;
if (this.date != thatFurnitureBillingRequest.date) return false;
if (!StringUtils.equals(this.phone, thatFurnitureBillingRequest.phone)) return false;
if (!this.items.equals(thatFurnitureBillingRequest.items)) return false;
if (this.totalAmount != thatFurnitureBillingRequest.totalAmount) return false;
if (this.amountPaid != thatFurnitureBillingRequest.amountPaid) return false;
return true;
}
}
但当我试图编译代码时,它最终会出错
[错误]/Users/kuldeep/Work/Repositories/BillingModel/src/main/java/com/tarkshala/services/lambda/model/UpdateBillRequest.java:[24,5]com.tarkshala.services.lambda.model.UpdateBillRequest中的builder()无法覆盖com.tarkshala.services.lambda.model.FurnitureBillingRequest中的builder()
[错误]返回类型com.tarkshala.services.lambda.model.UpdateBillRequest.UpdateBillRequestBuilder与com.tarkshala.services.lambda.model.FurnitureBillingRequest.FurnitureBillingRequestBuilder不兼容
我不知道出了什么问题?这是Java的一个限制。尝试编译以下代码:
class Foo {
public static FooBuilder builder() {
return new FooBuilder();
}
}
class Bar extends Foo {
public static BarBuilder builder() {
return new BarBuilder();
}
}
class FooBuilder {
public Foo build() {
return new Foo();
}
}
class BarBuilder {
public Bar build() {
return new Bar();
}
}
经典的生成器模式,但我忽略了所有属性
现在eclipse告诉我,对于Bar.builder()
不能有具有不兼容返回类型的重载方法。这甚至适用于静态方法。我猜由于
builder()
是在超类中定义的,因此它将返回超类的实例。你也试过将@Builder
添加到子类中吗?看来你无法将@Builder
添加到子类中,而且施法也不起作用……那么看起来像是Lombok的局限性。像这样设计lombok有什么特别的原因吗?publicFooBuilder()
inFoo
和Bar extends Foo
中的publicBarbBuilder()
无法理解你的观点。请详细说明。换句话说,问题是当Bar
扩展Foo
时,BarBuilder
不扩展FooBuilder
(Lombok创建的也不扩展),因此不兼容类型。是的。虽然可以跟踪超类中的@Builder
注释,但这也会带来很多复杂性。最好的方法是使用@Builder(builderMethodName=“fooBuilder”)
public class UpdateBillRequestTest {
@Test
public void toJson() {
UpdateBillRequest request = UpdateBillRequest.builder()
.date(1234567868L)
.uid("9i09909-90i90-8u90")
.name("kuldeep")
.phone("9535580366")
.build();
System.out.println(request.toJson());
}
@Test
public void toObject() {
}
}
class Foo {
public static FooBuilder builder() {
return new FooBuilder();
}
}
class Bar extends Foo {
public static BarBuilder builder() {
return new BarBuilder();
}
}
class FooBuilder {
public Foo build() {
return new Foo();
}
}
class BarBuilder {
public Bar build() {
return new Bar();
}
}