配列から重複要素を削除するジェネリック関数を書いてみました。
public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) {
//do quicksort
Arrays.sort(arr);
ArrayList<E> list = new ArrayList<E>();
int i;
for(i=0; i<arr.length-1; i++) {
if(arr[i].compareTo(arr[i+1]) != 0) { //if not duplicate, add to the list
list.add(arr[i]);
}
}
list.add(arr[i]); //add last element
return list;
}
ご覧のとおり、Comparableインターフェイスで定義されたcompareTo()メソッドで要素を比較しているため、int[]配列のようなプリミティブ型を渡すことはできません。
最初の行(メソッド宣言)に気づきました:
public static <E extends Comparable<E>> ArrayList<E> removeDuplicate(E[] arr) {
どうして「同等の拡張」と書かれているのですか?
Comparableはインターフェースですが、なぜ「Comparableを実装」しないのですか?ジェネリック関数を書いたのはこれが初めてなので、そのような詳細については少し混乱しています。(不思議に思うと理解できなくなります。)
編集:このトピックに関連するこの記事を見つけました。