[英]What signature should a generic method in Java have so that It can accept any <T that implements Iteralbe and stores List<U>> and…?
我想創建一個遍歷任何存儲ArrayList<U>
集合的方法 - 讓我們調用該集合T
; 例如,它可以是LinkedList
, ArrayList
或任何其他Collection
; U
- 是另一種需要記憶的類型; 我想要創建的方法應該返回相同的集合T
但它應該存儲LinkedList<U>
。
“錯誤的”希望聲明:
public <T extends Collection, U> T<LinkedList<U>> rewrap (T<ArrayList<U>> arrayList) {
T<LinkedList<U>> linkedList = new T<LinkedList<U>>();
// do some stuff here
return linkedList;
}
我仔細閱讀了文檔但我找不到如何實現目標的方法。
我的建議:
public static <T, C extends Collection<LinkedList<T>>> C rewrap (Collection<ArrayList<T>> in, Supplier<C> collectionFactory) {
C out = collectionFactory.get ();
for (ArrayList<T> list : in) {
out.add (new LinkedList<T> (list));
}
return out;
}
請注意,您必須傳遞Supplier
才能使該方法能夠創建所需類型的Collection
實例。
用法:
ArrayList<ArrayList<String>> in = new ArrayList<> ();
in.add (new ArrayList<String> ());
in.get (0).add ("abc");
ArrayList<LinkedList<String>> out = rewrap (in, ArrayList::new);
編輯:您應該注意,此方法不要求輸出外部Collection
的類型與輸入外部Collection
的類型相同。
例如,如果在上面的示例中傳遞HashSet::new
供應商而不是ArrayList::new
,則可以傳遞ArrayList<ArrayList<String>>
輸入並獲取HashSet<LinkedList<String>>
輸出。
這將符合您的請求,但不嚴格執行返回集合類型以匹配輸入類型:
public <U> List<LinkedList<U>> rewrap(Collection<ArrayList<U>> arrayList) {
T linkedList = ...
// do some stuff here
return linkedList;
}
我不認為通用接口有一種方法可以在編譯時強制執行返回的列表與進入的Collection具有相同的實現。
另請注意,您無法重復使用ingoing集合或調用new T<...>()
。 您必須使用反射或其他方法參數。
伊蘭的回答很好。 但是,如果您不想通過供應商,則可能需要采用此方法
public static void main(String[] args) {
// create inner list
ArrayList<String> innerList = new ArrayList<>();
innerList.add("test string 1"); innerList.add("test string 2");
// add it to outer List twice because why not
ArrayList<ArrayList<String>> outerList = new ArrayList<>();
outerList.add(innerList); outerList.add(innerList);
// rewrap it
ArrayList<LinkedList<String>> rewrapped = rewrap(outerList);
System.out.println("rewrapped.");
}
public static <T, C extends Collection<LinkedList<T>>> C rewrap (Collection<ArrayList<T>> in) {
Collection<LinkedList<T>> out = null;
try {
out = (in.getClass().newInstance());
} catch (InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
C myC = (C) out;
for (ArrayList<T> list : in) {
myC.add (new LinkedList<T> (list));
}
return myC;
}
當然,您需要一些更好的異常處理,但這個示例代碼按照我的預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.