Cannot create a generic array of T
public interface IPredicate{ boolean evaluate(T input); } public static final T findAll(T[] array , IPredicate match) { ArrayList temp = new ArrayList (); for (T t : array) { if ( match.evaluate(t) ){ temp.add(t); } } × T[] result = new T[0]; return temp.toArray(result); }
C#の述語論理を使ったArray.FindAll
幸いにもジェネリクスに対応したclone()はできるようだけど、そうすると配列のクリアが必要になる訳で無駄なコードが。
駄目だこりゃと思ったが、同じようなこと(型パラメタによる配列の生成)は考慮されていたのか、ジェネリクスに対応した要素数を変えることのできるCopyメソッドがあったのを見つけた。
T[] result = Arrays.copyOf(array, 0); return temp.toArray(result);
toArray(T[])は空の配列をセットしてやれば、メソッド内で勝手に要素数を増量してくれるのだ。(この仕様自体アドホックのような気がしないでもない)
これでやっと出来たので使ってみたが...
public void 配列から偶数だけを取得() { int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int odds = FinderUtil.findAll(array , new IPredicate(){ @Override × public boolean evaluate(int input) { return ( (input % 2) == 0 ); } }); assertArrayEquals(odds, new int[]{0, 2, 4, 6, 8}); }
型パラメタにはプリミティブ型は使えないんだった。orz....
もう止めた。