在抽象方法中使用子类作为参数和 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
抽象级别的适当类型参数
我正在尝试使用抽象 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