プリミティブタイプはJavaのジェネリクスに入らない

int, long, doubleなどのプリミティブな型を使うことは当然だ。これらに対して同じデータ構造やアルゴリズムを適用したいことがあるのも当然だ。
ジェネリクスがあるのだからint, long, doubleで共通な計算は実装できそうなものだが、できない。

例えば配列の和を求めるクラスを作りたいと思う。

// error
class Sum<T> {
    T sum(T[] a) {
        T ret = 0;
        for (int i = 0; i < a.length; i++) {
            ret += a[i];
        }
        return ret;
    }
}

困難① ジェネリクスにはプリミティブ型を入れられない

そのため `new Sum<long>().sum(array)` のように書けない
では long の代わりにラッパーである Long を使えばいいかと言うとそうではない。

困難② ジェネリクス型は `new` が使えない、`+=` が使えない

Integer型やLong型では演算子が使えるが、ジェネリクスになると利用できない。Javaジェネリクスはそういうもの。

解決

そんな不便なことがあるだろうか?じゃあ`Arrays.sort`はどう実装してるんだろう?JDKソースコードを見てみる。

public static void sort(int[] a)

プリミティブ型の`sort`や`binarySearch`などはそれぞれの型に対して全く同じ実装が(型だけ変えて)繰り返し記述されている。これをマネすれば良さそう。

プログラミングコンテストで使う場合はどうせソースコードをコピー&ペーストする。よって long 型だけ用意しておいて double 型が必要ならエディタで置換するのが最も良い方法だと思う。