特定のコレクションを「述語」でフィルタリングし、フィルタリングされた要素 (述語が true を返すもの) のみを含む新しいコレクションを返すメソッドを作成しています。
このようなもの :
public <T> Collection<T> filter(Collection<T> collection, Closure<T> predicate);
Collection()
Java では、型消去のために、実行時にnew を作成することはできません。
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
コンパイルされません。
filter() メソッドで LinkedList を正しくインスタンス化するには、どのように宣言すればよいですか?
よろしく、