2009-05-26 119 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); 

因此該返回類型必須保持兼容(重寫/重因子不是一個選項)

基本上我想的方法,如果稱爲

troublefunction(foo, Bar.class); 

List<? super Foo>時返回列表<? super Bar>叫做

troublefunction(foo, Bar.class); 
+0

在Java中,函數被稱爲方法。 – eleven81 2009-05-26 14:50:42

+0

接口不是保留字? – 2009-05-26 14:56:19

回答

1

一般來說在這樣的情況下,你需要t o顯式傳遞用於返回值的(一般參數化的)一個Class對象。

但是看起來您已經在您的案例中完成了這項工作,因此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

我在此再次看了一下,問題是,我想用「超級」的返回類型 簽名我一直在尋找或多或少:

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

,這是不可能