【发布时间】:2018-06-03 14:04:59
【问题描述】:
我有一个基类
@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;
}
}
还有一个子类扩展如下
@Getter
@Setter
@NoArgsConstructor
public class UpdateBillRequest extends FurnitureBillingRequest {
private static final Gson gsonSerializer;
static {
gsonSerializer = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
}
@Expose
private String uid;
@Builder
public UpdateBillRequest(String uid, String name, long date, String phone, List<BillItemRO> items, int totalAmount, int amountPaid, String remark, String address) {
super(name, date, phone, items, totalAmount, amountPaid, remark, address);
this.uid = uid;
}
public UpdateBillRequest(String uid, String name, long date, String phone, int totalAmount, int amountPaid, String remark, String address) {
super(name, date, phone, totalAmount, amountPaid, remark, address);
this.uid = uid;
}
public String toJson() {
return gsonSerializer.toJson(this);
}
public FurnitureBillingRequest toObject(String json) {
return gsonSerializer.fromJson(json, FurnitureBillingRequest.class);
}
}
我写了一个单元测试来检查json是否创建良好。
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() {
}
}
但是当我尝试编译代码时,它最终会出错
[错误] /Users/kuldeep/Work/Repositories/billing/BillingModel/src/main/java/com/tarkshala/services/lambda/model/UpdateBillRequest.java:[24,5] builder() in com. tarkshala.services.lambda.model.UpdateBillRequest 无法覆盖 com.tarkshala.services.lambda.model.FurnitureBillingRequest 中的 builder() [错误] 返回类型 com.tarkshala.services.lambda.model.UpdateBillRequest.UpdateBillRequestBuilder 与 com.tarkshala.services.lambda.model.FurnitureBillingRequest.FurnitureBillingRequestBuilder 不兼容
我不知道出了什么问题?
【问题讨论】:
-
我猜是因为
builder()是定义在超类中的,所以会返回超类的一个实例。您是否尝试过将@Builder也添加到子类中? -
好吧,看来你不能将
@Builder添加到子类中,并且强制转换也不起作用...... -
那看来是龙目岛的局限了。像这样设计龙目岛有什么特别的原因吗?
-
public FooBuilder builder()在Foo和public BarBuilder builder()在Bar extends Foo。 -
@JohannesKuhn 无法理解您的观点。请详细说明。