いや、J2SDK1.4で、Genericsのコードをコンパイルするという話ではなくて
JDK5.0で、Generics使用しているコードをコンパイルして、J2SE1.4のJVMで
動かすための方法があることを聞いたのでメモ。
失敗例:
> javac -source 1.5 -target 1.4 Hello.java
これだと、ダメ。
成功例:
>javac -source 1.5 -target jsr14 Hello.java
隠しオプションみたいだ
ちなみに、JSR14とは、型の総称性(?変な日本語)ま、いわゆるGenericsのスペック番号だ。
実験:
Hello.java
import java.util.Map;
import java.util.HashMap;
public class Hello{
public static void main(String[] args){
Mapmap = new HashMap ();
map.put(“いち”,1);
map.put(“に”,2);
map.put(“さん”,3);
map.put(“し”,4);
System.out.println(map);
}
}
これをコンパイルしてデコンパイルする。するとちゃんと区別されているか分かる。
【target 5にした場合】
hashmap.put(“\u3044\u3061”, Integer.valueOf(1));
hashmap.put(“\u306B”, Integer.valueOf(2));
hashmap.put(“\u3055\u3093”, Integer.valueOf(3));
hashmap.put(“\u3057”, Integer.valueOf(4));
【target jsr14にした場合】
hashmap.put(“\u3044\u3061”, new Integer(1));
hashmap.put(“\u306B”, new Integer(2));
hashmap.put(“\u3055\u3093”, new Integer(3));
hashmap.put(“\u3057”, new Integer(4));
と、AutoBoxingをする際に5.0で追加されたAPIであるInteger.valueOf(int)を回避している。
素晴らしい!
ま、ドコまで意味があるかだが・・・・
Genericsとか使うなら素直にJVMもJ2SE5.0にすればいいと思う・・・・
この方法だと、うっかり明示的に5.0のAPIを使った時は、無視されてコンパイルできてしまうんで
クラスファイルのバージョンはJ2SE1.4相当でも、ライブラリにAPIが無いため動かない
クラスファイルが出来てしまう。やはり注意して使わなくてはいけないオプションのようだ。
コメントを残す