Genericsを使用したコレクション・クラスのソート

Listなどのコレクション・クラスをソートする場合、java.util.Collectionsクラスのsort()メソッドを利用すると便利である(配列の場合java.util.Arraysを使用)。

例えばAnimalというクラスのリストをソートする場合、以下のようなコードになる*1

import java.util.Collections;
public class Animal {
    public String name;
    public int age;
}

public class DataComparator implements Comparator
    public int compare(Object o1, Object o2) {
        int age1 = ((Animal)o1).age;
        int age2 = ((Animal)o2).age;
        return age1 - age2;
    }
}

List animalList = getAnimalList();
Collections.sort(animalList, new DataComparator);

しかし、上記のコードをJDK5以降でコンパイルすると、「無検査呼び出し」というような警告が出る。この警告が出ないようにするには、Genericsを利用して以下のように記述すると良い*2 *3

import java.util.Collections;
public class Animal {
    public String name;
    public int age;
}

public class DataComparator implements Comparator<Animal> {
    public int compare(Animal o1, Animal o2) {
        int age1 = o1.age;
        int age2 = o2.age;
        return age1 - age2;
    }
}

List<Animal> animalList = getAnimalList();
Collections.sort(animalList, new DataComparator);

参照:
nextindex.net
人材開発室: sort
J2SE 5.0 Tiger 虎の穴 Generics

*1:DataComparatorクラスを作成する代わりに、AnimalクラスでComparableインタフェースをimplementsしてもよい。Animalクラスの修正が可能であれば、Comparableインタフェースを利用し、修正出来ない場合にはComparatorインタフェースを利用するという使い分けになると思われる

*2:Genericsについては「http://tyche.pu-toyama.ac.jp/~ko-ji/now-java/GenBox.html」が参考になります。

*3:警告が出る理由については「サポートページ:ひとりでできる Java 実践入門:|技術評論社」に分かりやすく書かれている。