るいもの戯れ言 - J2SE1.4でGenerics使用コードを実行する

ここに触発されて昔見た覚えのあるリンクを引っ張りだしてきた.

public class Test {
    public static void main(String[] args) {
        Test test = new Test();
        test.doit();
    }
    public void doit() {
        List<String> l = getList();
        setList(l);
    }
    public List<String> getList() {
        List<String> list = new ArrayList<String>();
        list.add("abc");
        list.add("def");
        list.add("ghi");
        return list;
    }
    public void setList(List<String> list) {
        for (String entry : list) {
            System.out.println("entry = " + entry);
        }
    }
}

上記のようなどうでもいいコードを書いて

-source 1.5 -target jsr14

付きでビルドして1.4系のjavaコマンドで実行すると確かに動く.
ついでに,これをJarファイルに固めて1.4系のプロジェクトで利用しても動く.
コードアシストではListとかは、ふつーのListになるけど,String以外のオブジェクトが詰まったListを渡すと,実行時にしっかり落ちる(ClassCastExceptionになる).


調子に乗ってenum使ってみたらダメね.enumは親クラス(java.lang.Enum)があるんじゃ.当然,同じ理由でannotationもダメ.
使えるのは,

  • Generics
  • Autoboxing
  • 拡張for文
  • static import

くらいかな.Java5で増えたAPI(printf()とか)使えないし,かなり気を遣ってコーディングしないといけない.