2016-10-20 231 views
3

我想創建一個泛型方法,獲取Collection<T>作爲參數,對元素(映射)執行某些操作並返回Collection<R>。 這不是一個問題,聲明如下:Java泛型,嵌套類型參數

public <R,T> Collection<R> foo(Collection<T> c); 

現在,我想迫使我的方法返回相同類型的參數的集合,所以就沒有必要把返回對特定收藏的價值。類似這樣的:

public <R, T, S extends Collection> S<R> foo(S<T> c); 

可悲的是,這不能編譯。

這可以以某種方式完成嗎?什麼是正確的方法來做到這一點?

+0

你不能參數化類型參數標記。你可能想要:'...,S擴展集合'然後'(S c)'。 –

+0

R與T有什麼關係? – Powerlord

+0

@Powerlord,我想申請一個類型T-> R的映射器。 T和R之間沒有關係。 –

回答

1

一種方法是做到以下幾點:

public <R, S, CR extends Collection<R>, CS extends Collection<S>> CR foo(CS c); 

的問題是結合你的說法,你的返回類型。

+0

我想強制集合是相同類型的,所以Java會推斷返回值,我不需要每次調用方法 –

+0

@orimarcovitch您是否真的嘗試過代碼?不需要鑄造。 –

+0

你其實是對的!這確實有用! –

-1

您可以使用Java中的方法重載,嘗試在您的映射方法中重載數據操作。如果你想使用泛型要做到這一點

+0

我真的不明白你的解決方案,但無論如何,重載不會導致我的返回值是我想要的... –

0

你不能以這種方式將兩種仿製藥綁在一起。無論如何,即使你仍然需要在foo中創建一個新的集合。 (您不能重複使用C,這將創建一個poluted堆)這樣做會爲強制執行的類型集合提供了供應商的

方式一:

public static void callFoo(){ 
    List<String> strings = new ArrayList<>(); 
    ArrayList<Integer> foo = foo(strings, ArrayList::new); 
    } 

    public static <R,T, S extends Collection<R>> S foo(Collection<T> ts, Supplier<S> supplier){ 
    S s = supplier.get(); 
    for(T t:ts){ 
     s.add(null); 
    } 
    return s; 
    }