Generics for J2SE1.4

いや、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){
  Map map = 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が無いため動かない
クラスファイルが出来てしまう。やはり注意して使わなくてはいけないオプションのようだ。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

“Generics for J2SE1.4” への2件のフィードバック

  1. tacのアバター

    IBM Java5SE betaが出たようです.http://www-128.ibm.com/developerworks/java/jdk/java5beta/

  2. きとらまさなおのアバター
    きとらまさなお

    IBMのVMって性能ええんかなぁ・・・
    今は、Mustang追いかけるので精一杯!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください