Использование подкласса как параметра и типа возврата в абстрактном методе - PullRequest
0 голосов
/ 02 февраля 2019

Я пытаюсь использовать абстрактный класс и сделать все его расширения, чтобы передать подкласс в метод и вернуть его.Это лучше объяснить только с помощью кода.

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 голосов
/ 02 февраля 2019

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

...