在抽象方法中将子类用作参数和返回类型

时间:2019-02-02 07:25:05

标签: java generics abstract-class abstract

我试图使用抽象类,并对其进行所有扩展,以将子类传递给方法并返回相同的类。最好仅通过代码来解释。

public abstract class AbstractRequestReBuilder {

    @Autowired
    private CreditCardUpdateProcessor creditCardUpdateProcessor;

    abstract BookingRequest rebuildRequest(BookingRequest request);

    public BillingDetails updateCard(BillingDetails billingDetails) {
        return creditCardUpdateProcessor.updateCreditCardInBillingDetails(billingDetails);
    }

}
@Component
public class HotelRequestReBuilder extends AbstractRequestReBuilder {

    public HotelBookingRequest rebuildRequest(HotelBookingRequest request) {
        BillingDetails billingDetails = request.getBillingDetails();
        BillingDetails modifiedBillingDetails = updateCard(billingDetails);
        request.setBillingDetails(modifiedBillingDetails);
        return request;
    }
}

其中

public class HotelBookingRequest extends BookingRequest<RoomDetail> implements Serializable {
}

当前,我收到一个编译器错误,指出rebuildRequest中未实现HotelRequestReBuilder。任何人都可以请让我知道如何解决它。

1 个答案:

答案 0 :(得分:0)

HotelRequestReBuilder.rebuildRequest(HotelBookingRequest)不会覆盖AbstractRequestReBuilder.rebuildRequest(BookingRequest),它会使其过载。

最简单的解决方案是将HotelBookingRequest设置为AbstractRequestReBuilder的类型参数:

public abstract class AbstractRequestReBuilder<B extends BookingRequest<...>> {
    abstract B rebuildRequest(B request);
}

并使用以下代码实现它:

public class HotelRequestReBuilder extends AbstractRequestReBuilder<HotelBookingRequest> {

    public HotelBookingRequest rebuildRequest(HotelBookingRequest request) {
        BillingDetails billingDetails = request.getBillingDetails();
        BillingDetails modifiedBillingDetails = updateCard(billingDetails);
        request.setBillingDetails(modifiedBillingDetails);
        return request;
    }
}

这将解决您的编译时问题。只需注意,您需要为BookingRequest<...>使用适合AbstractRequestReBuilder的抽象级别的适当的type参数

相关问题