2012-04-06 2 views
1

Для лучшего понимания моего вопроса см следующих классов:Возвращения правильного типа Java из класса типизированного пропускания класса дженерик

public interface Invoker<R> { 
    public String getName(); 
    public R getResult(); 
} 

реализация:

public class RepairFetcher implements Invoker<List<String>> { 

    @Override 
    public String getName() { 
    return this.getClass().getSimpleName(); 
    } 

    @Override 
    public List<String> getResult() { 
    return new ArrayList<String>(); 
    } 

} 

класса, в котором его идет не так:

public class OperationService { 

    public <R> R invoke(Class<R> invoker, Object... parameters) { 
    WebserviceOperation<R> operation = new WebserviceOperation<R>(invoker); 
    Invoker<R> instance = operation.getInstance(); 

    return instance.getResult(); 
    } 

} 

основной класс:

public class Main { 

    public static void main(String[] args) { 

    OperationService operationService = new OperationService(); 
    operationService.invoke(RepairFetcher.class, new Object[] {}); 

    } 

} 

Проблема: В этот момент способ

operationService.invoke (RepairFetcher.class, новый объект [] {});

возвращает RepairFetcher, который не так странно, потому что аргумент в методе Invoke:

класса запустившего

который возвращает R, который является RepairFetcher.class.

То, что я хочу Я не хочу, метод Invoke вернуть класс RepairFetcher, но я хочу, чтобы вернуть объявленный тип, который Список < String>.

Возможно ли это, и если да, то как это реализовать?

Заранее благодарен!

ответ

2

Не уверен, но попробуйте:

public <T, R extends Invoker<T>> T invoke(Class<R> invoker, Object... parameters) { 
+0

Ницца, работает как шарм! – NickGreen

0

RepairFetcher реализует Invoker<List<String>>, так что RepairFetcher является Invoker<List<String>>, и возврат хорош.

Если вы проверить это:

RepairFetcher InstanceOf Invoker<List<String>>, ответ должен быть правдой.

PS: Я заменить < (т.к. редактор имеет проблемы с <

+1

Я исправил его, вам нужно использовать кнопку «код». – Puce

1

код вы вывесили не компилируется в текущей форме (его пропускает некоторые части), но, судя по тому, что вы пытаетесь сделать, вы должны знать, что Class параметризуется типом класса, поэтому тип String.getClass() равен Class<String>.

Тем не менее, ваше определение функции

public <R> R invoke(Class<R> invoker, Object... parameters) { 

должны, вероятно, будет что-то вроде

public <R> R invoke(Class<Invoker<R>> invoker, Object... parameters) { 

так что вы можете быть уверены, чтобы вернуть тот же тип, что ваши доходы инициатора вызова.

Смежные вопросы