[英]Java generics, nesting Type parameters
我想創建一個泛型方法,將Collection<T>
作為參數,對元素(映射)執行某些操作並返回Collection<R>
。 這不是問題,具有以下聲明:
public <R,T> Collection<R> foo(Collection<T> c);
現在,我想強制我的方法返回相同類型參數的Collection,因此不需要將返回值強制轉換為特定的集合。 像這樣的東西:
public <R, T, S extends Collection> S<R> foo(S<T> c);
可悲的是,這不會編譯。
這可以以某種方式完成嗎? 這樣做的正確方法是什么?
如果要使用泛型,執行此操作的一種方法是執行以下操作:
public <R, S, CR extends Collection<R>, CS extends Collection<S>> CR foo(CS c);
問題是綁定您的參數和返回類型。
你不能用這種方式將兩個泛型綁在一起。 無論如何,即使你仍然需要在foo中創建一個新的集合。 (你不能重用c,這將創建一個堆積的堆)
一種方法是為集合提供強制執行類型的供應商:
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;
}
您可以在Java中使用方法重載,嘗試在映射方法中重載數據操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.