Параметр общего типа класса

Предпосылки:

Существует сторонняя библиотека, предоставляющая следующий код (НЕ может быть изменен):

/**
* @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(); называется.

0 ответов

Другие вопросы по тегам