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 を使えばいいかと言うとそうではない。
解決
そんな不便なことがあるだろうか?じゃあ`Arrays.sort`はどう実装してるんだろう?JDKソースコードを見てみる。
public static void sort(int[] a)
プリミティブ型の`sort`や`binarySearch`などはそれぞれの型に対して全く同じ実装が(型だけ変えて)繰り返し記述されている。これをマネすれば良さそう。
プログラミングコンテストで使う場合はどうせソースコードをコピー&ペーストする。よって long 型だけ用意しておいて double 型が必要ならエディタで置換するのが最も良い方法だと思う。