2009-05-26 6 views
3

У нас есть метод более или менее похожий на следующий. однако мы в настоящее время возвращаем список который в функции bla() вернет List<Bar> во время выполнения.Возврат родового типа от общей функции

Я ищу способ сделать как

List<Interface> = troubleFuction(foo, bar.getCLass());; 

и

List<Bar> = troubleFuction(foo, bar.getCLass());; 

возможно. basicaly я хочу, чтобы вернуть список, который был бы совместим с интерфейсом однако это дает следующую ошибку

* Несоответствие типа: не может конвертировать из List<capture#3-of ? extends Bar> в List<Interface>*

есть ли способ, чтобы сделать этот тип возврата можно или это время выполнения стирания делает это невозможным

public <T1 extends Interface, T2 extends Interface> List<"problem"> troubleFunction(T1 in, Class<T2> clazz) { 
    return in.doStuffWhichGeneratesAlistOF(clazz) 
} 

public void bla() { 
    Foo foo = new Foo(); // implements interface 
    Bar bar = new Bar(); // implements interface 
    List<Interface> ifaces = toubleFuction(foo, bar.getCLass()); 
    List<Bar> mustAlsoWork = toubleFuction(foo, bar.getCLass()); 
} 

редактировать: в много существующей базы кода метод вызывается как

List<Bar> result = troubleFunction(List<Interface> list, Bar.class); 

, таким образом, этот тип возвращаемого значения должен остаться совместимым (переписать/переделан это не вариант)

по существу я хочу способ вернуть список <? super Bar> если называется

troublefunction(foo, Bar.class); 

и List<? super Foo> когда

troublefunction(foo, Bar.class); 
+0

В Java функция называется методом. – eleven81

+0

Интерфейс не зарезервированное слово? –

+0

iface должен быть списком ? –

ответ

1

Вообще говоря, в таких ситуациях вам нужно t o явно передать объект класса в (в общем параметризованном), который используется для возвращаемого значения.

Однако похоже, что вы уже сделали это в своем случае, так ли это не будет работать для troubleFunction, который будет объявлен для возврата List<T2>? В качестве альтернативы, если вы хотите сохранить ее в целом, попросите ее вернуть List<? extends Interface>.

0

Как я понимаю, типы аргументов рассматриваются перед типом цели, чтобы вывести общие аргументы. Так что, я думаю, вы должны явно указать общие аргументы, которые я думаю, идет что-то вроде этого:

List<Interface> iface = this.<Interface>troubleFunction(foo, bar.getCLass()); 

где

public <T extends Interface> List<T> troubleFunction(
    T in, Class<? extends T> clazz 
) { 
1

Вы не дает нам достаточно информации, чтобы действительно сказать, что вам нужно делать. Например, вы не указали нам подпись типа doStuffWhichGeneratesAlistOF() или сообщите нам, что она делает. И вы не сказали нам, что тип аргумента «in» имеет отношение ко всему этому.

Уверенный, это возможно, чтобы тип возвращаемого метода был общим.Например,

public <T extends Interface> List<T> troubleFunction(Interface in, Class<? extends T> clazz) { 
    List<T> result = new ArrayList<T>(); 
    result.add(clazz.newInstance()); 
    return result; 
} 

И тогда вы могли бы вызвать метод непосредственно, как это и было бы работать (вам не нужно указывать параметр типа явно, поскольку это вытекает из задания):

List<Interface> iface = this.troubleFunction(foo, bar.getCLass()); 

Но, видя, как в вашем коде выше вы возвращаете результат in.doStuffWhichGeneratesAlistOF(clazz), вам, вероятно, придется также сделать возвращаемый тип этого метода. Но я не могу вам помочь, потому что у нас нет информации об этом методе.

+0

Функция in возвращает список экземпляров класса Bar при вызове foo.doStuffWhichGeneratesAlistOF (Bar.class) – pvgoddijn

0

я уже смотрел на это снова и проблема заключалась в том, что я хотел использовать «супер» тип возвращаемого подпись, я искал более или менее:

public <T1 extends interface, T2 super T1> List<T2> getAList(Class<T1> clazz); 

что не возможно