我正在寫一個方法,用「Predicate」過濾特定集合,並返回一個僅包含過濾元素的新集合(Predicate返回true的集合)。如何在運行時創建通用集合<T>?
事情是這樣的:
public <T> Collection<T> filter(Collection<T> collection, Closure<T> predicate);
我知道,在Java中,我不能只在運行時創建一個新的Collection()
,因爲類型擦除的。
我也通過向方法傳遞一個額外參數來調用T.newInstance()來了解「解決方法」。
這看起來像:
public <T> Collection<T> filter(Class<? extends Collection<T>> collectionToInstanciate, Collection<T> collection, Closure<T> predicate) {
// create the new Collection
Collection<T> container = collectionToInstanciate.newInstance();
// and then add only filtered items
Iterator<T> iter = collection.iterator();
while (iter.hasNext()) {
T obj = iter.next();
// if Predicate.invoke() returns true, then keep element, otherwise skip it
if (predicate.invoke(obj)) {
container.add(obj);
}
}
return container;
}
但我應該怎麼叫我的方法是什麼?
舉例來說,如果我想只有一列整數的奇數,我想要做的:
// instanciate ArrayList<Integer> = [1, 2, 3, 4, 5]
ArrayList<Integer> array = ...;
// return a new LinkedList<Integer> with only odd numbers
filter(LinkedList<Integer>.class, array, new Closure<Integer>() {
public Boolean invoke(Integer arg_p) {
return (arg_p % 2 == 0);
}
});
// should return [2, 4] as a LinkedList<Integer>
的問題是,
LinkedList<Integer>.class
不能編譯。
我該如何聲明,以正確instanciate過濾器()方法LinkedList?
問候,
也許我錯了,但不能傳遞MyClass.class並將其用作方法內部的LinkedList參數? – Quirin
請注意,「集合」是一個接口,而不是一個類。順便說一句,由於類型擦除,您應該使用原始類,而不是參數化的方式,即'LinkedList.class'而不是'LinkedList .class'。 –
@LuiggiMendoza:使用LinkedList.class而不是LinkedList .class實際上是我的問題:我不想在filter()方法中實例化一個「原始」LinkedList,所以我會得到Peter Lawrey的解決方案。謝謝 –