2009-08-24

Java : 自然比較メソッドを実装したい


Java で自然比較メソッドを実装したい



import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main1 {

    public static void main(String[] args) {
        Main1.sample1();
    }

    public static void sample1() {
        List<FooInfo> list = createSample1List();
        System.out.println("before");
        for (FooInfo info : list) {
            System.out.println(info.toString());
        }
        Collections.sort(list);
        System.out.println("after");
        for (FooInfo info : list) {
            System.out.println(info.toString());
        }
    }

    private static List<FooInfo> createSample1List() {
        List<FooInfo> list = new ArrayList<FooInfo>();
        FooInfo info = null;

        info = new FooInfo();
        info.set("5", "A");
        list.add(info);

        info = new FooInfo();
        info.set("1", "B");
        list.add(info);

        info = new FooInfo();
        info.set("3", "C");
        list.add(info);

        info = new FooInfo();
        info.set("4", "D");
        list.add(info);

        info = new FooInfo();
        info.set("2", "E");
        list.add(info);

        return list;
    }
}

public class FooInfo implements Comparable {

    private String code;
    private String name;
    
    public FooInfo() {
    }

    public void set(String code, String name) {
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    public int compareTo(FooInfo obj) {
         return getCode().compareTo(obj.getCode());
     }

    @Override
    public String toString() {
        return "code=[" + code + "],name=[" + name + "]";
    }
}



Oracle JDeveloper 11g 11.1.1.0.2
コンパイラ Javac
JavaSE JDev にくっついてくるやる(デフォルト 1.6.0_05)



で、ビルドしてみる。


Error(xx):  警告:[unchecked] 無検査メソッド呼び出し: java.util.Collections の <T>sort(java.util.List<T>) は (java.util.List<FooInfo>) に適用されます。



なんて出てた。警告なのに、エラー ... 。画面上、特に警告文ない。因みにコンパイラを Ojc にすると、問題ない。以前のバージョンだと警告が出ただけな気がする。
IDE 使わずに Javac でコンパイルすると警告だけ出た。

型の問題?カタカタ。

何かあったら eclipse (違。
eclipse を立ち上げてみる。


eclipse-SDK-3.3.1.1-win32
jdk 1.6.0_06



ビルドすると警告だけ出た。
ソースの画面を眺める。


public class FooInfo implements Comparable {

Comparable is a raw type. References to generic type Comparable<T> should be parameterized



の「Comparable」ところで警告が出てた。それと。


Collections.sort(list);

Type safety: Unchecked invocation sort(List<FooInfo>) of the generic method sort(List<T>) of type Collections



ああ。そういうこと。
FooInfo クラスをごにょごにょ。


public class FooInfo implements Comparable<FooInfo> {

    private String code;
    private String name;
    
    public FooInfo() {
    }

    public void set(String code, String name) {
        this.code = code;
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public String getName() {
        return name;
    }

    public int compareTo(FooInfo obj) {
         return getCode().compareTo(obj.getCode());
     }

    @Override
    public String toString() {
        return "code=[" + code + "],name=[" + name + "]";
    }
}



警告も出なくなった。
そして、うっすらとへこんだ。