在抽象方法中使用子类作为参数和 return 类型

Using subclass as both parameter and return type in abstract method

我正在尝试使用抽象 class 并对其进行所有扩展以将 subclass 传递给方法,并且 return 相同。最好仅通过代码来解释。

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 中实现。任何人都可以检查并让我知道如何解决它。

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

抽象级别的适当类型参数