Дизайн ваших классов по своей сути небезопасен. В частности, метод serveRequest
:
public void serveRequest(PayData payData, PaymentType paymentType) {
PayService<PayData> payService = (PayService<PayData>) payServiceFactory.getService(paymentType);
payService.pay(payData);
}
Нет способа обеспечить, чтобы тип времени выполнения payData
был совместим с тем, что ожидает payService.pay
. В зависимости от paymentType
, getService
может возвращать PayService<Anything>
во время выполнения, поэтому payService.pay
может ожидать любой тип во время выполнения. Поскольку тип, которым должен быть payData
, может быть известен только во время выполнения, вы не можете применить его во время компиляции.
Лучшее, что вы можете сделать, это поставить SuppressWarnings
и сделать payData
универсальным:
@SuppressWarnings("unchecked")
public <T extends PayData> void serveRequest(T payData, PaymentType paymentType) {
PayService<T> payService = (PayService<T>) payServiceFactory.getService(paymentType);
payService.pay(payData);
}