public class Test<T extends Test.Mapper<?>> {
SomeFactory<T> factory;
public Test(SomeFactory<T> factory) {
this.factory = factory;
}
public <V> V handle(T<V> request) { // fails how to get Class<V> of request.getCls() of a mapper or its subtype?
HttpUriRequest httpUriRequest = factory.get(request); // does not work
// decode response and return it as an object represented by request.getCls
return null;
}
public interface Mapper<T> {
Class<T> getCls();
}
public interface SomeMapper<T> extends Mapper<T> {
void doSomeAdditional();
}
public interface SomeFactory<T extends Test.Mapper<?>> {
HttpUriRequest get(T mapper);
}
}
Способ ручка представляет собой метод общего назначения, который выполняет запрос HTTP, а затем декодирует тело ответа в объект, который представлен getCls Преобразователь по методу(). Я хотел бы этот класс для обработки различных подтипов Mapper, так как SomeFactory реализации требуется для доступа некоторые методы только частности, к этому типуРодовой Подтип
Что-то вдоль линий этого
SomeFactory<SomeMapper<?>> somefactory = // factory implementation
Test<SomeMapper<?>> test = new Test<SomeMapper<?>>(someFactory);
test.handle(implementation of SomeMapper<Integer>); // should return an instance of Integer
Разъяснение: В основном конкретизации теста должны обрабатывать только типы(), соответствующие фактическому типу теста (SomeMapper или Mapper). Затем метод handle может принимать любые запросы этого фактического типа.
I.E. Если бы это было Test<SomeMapper<?>> test
и у меня есть запрос, как
ASomeMapper implements SomeMapper<Double> {}
BSomeMapper implements SomeMapper<Integer> {}
test.handle(new ASomeMapper()); // this should return Double
test.handle(new BSomeMapper()); // this shold return Integer
Может быть, я должен переделать?
Да, это именно то, что я пытаюсь сделать, так что это невозможно без кастинга? Поскольку фактический тип ASomeMapper известен во время компиляции, не может ли он это сделать? Это подтип SomeMapper. – xxtommoxx
Я обновил свой ответ с большим количеством объяснений, но вы как бы смешиваете 2 вещи. Общий метод с общим классом. Ваш код может поддерживать оба, но их сложно смешивать. – ATrubka
Пожалуйста, посмотрите на конец моего ответа. Это объясняет, почему вы не сможете использовать его так, как хотите. – ATrubka