Параметр общего типа класса
Предпосылки:
Существует сторонняя библиотека, предоставляющая следующий код (НЕ может быть изменен):
/**
* @param <T> result type of the request
* @param <U> exception type of the request
**/
public interface Request<T, U extends ThirdPartyException> {}
public class ConcreteRequest<T> implements Request<T, ConcreteException> {}
public class SimpleRequest<T> implements Request<T, SimpleException> {}
public class Api {
public void doConcreteRequest(ConcreteRequest<ConcreteType1> request);
public void doSimpleRequest(SimpleRequest<ConcreteType2> request);
public void doAnotherRequest(SimpleRequest<ConcreteType1> request);
}
Требования:
Я хочу создать простой класс для макетирования этих запросов и добавить некоторые общие функциональные возможности для макетов.
Что у меня так далеко:
public class MockRequestBuilder<T extends Request<R, U>, R, U extends ThirdPartyException> {
private Class<T> type;
public MockRequestBuilder(Class<T> type) {
this.type = type;
}
public T build() {
T mock = mock(type);
// Code to add additional stuff to mock here
return mock;
}
}
Проблема:
Как создать конкретный типобезопасный экземпляр такого ложного запроса, используя MockRequestBuilder
?
очевидно
new MockRequestBuilder<SimpleRequest<ConcreteType1>, ConcreteType1, SimpleException>(SimpleRequest.class);
не работает как SimpleRequest.class
не предоставляет информацию о двух других универсальных типах.
Второй способ, который я нашел, это использовать
new MockRequestBuilder<SimpleRequest, ConcreteType1, SimpleException>(SimpleRequest.class);
Но это, конечно, вернет SimpleRequest
без информации о типе вместо необходимого SimpleRequest<ConcreteType1>
когда метод build();
называется.