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.FindAllJava版が欲しくて書いてたんだが、型パラメタを使った配列のインスタンスは作れないんだった。orz ....

幸いにもジェネリクスに対応した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....

もう止めた。