Java

Generics 最高!

Java は、型に厳しくすることで実行時エラーをなくすというコンセプトは良いが、((クラス名)list.get(i)).メソッド() なんて苦痛すぎ。
JDK5.0 で導入された generics ではかなりの場面でわかりきったキャスティングを減らせて便利!
Mac では Tiger(JDK5.0ではなく、OS X 10.4)まで Tiger(JDK5.0)がリリースされなかったこともあり最近まで恩恵にあずかれなかった。
使ってみればこれはこれはほんとに便利!
というわけで最近は generics を使った楽ちんプログラミングを楽しんでいる。
たしか、generics を使っても target を 1.4 とか設定しておけば JDK5.0 じゃなくても動くはず。
JBuilder では Project -> Project Properties -> Build -> Java で
Language Features: Java 2 SDK, v 5.0(generics enabled)
Target VM: Java 2 SDK, v 1.4 and later
と設定するだけ。

さてさて、侍を全部ビルドするか、っちゅーことで ant でビルドして実行してみたら、
$ /System/Library/Frameworks/JavaVM.framework/Versions/1.4.2/Home/bin/java -jar samurai.jar
Exception in thread “main” java.lang.UnsupportedClassVersionError: net/homeip/yusuke/samurai/gui/Monitor (Unsupported major.minor version 49.0)
あぁ、build.xml 内で target を指定してなかったか。
修正して再度ビルドしてみれば
javac: リリース 1.5 のソースにはリリース 1.5 のターゲットが必要です。
あれれ、source 1.5 target 1.4 って指定できないのか・・・。JBuilder でできるのは独自のコンパイラを内蔵してるからかな?
クラスファイルのヘッダを適当にいじれば強引に動きそうな気がしなくもないけれども正攻法はだめみたいだ。
ちょっと調べてみると source 1.5 target 1.4 ができたバージョンもあったらしい。記憶違いではなかった。

既に100カ所以上書き換えているので今更JDK1.4用に書き戻す気はないので、さてどうしたもんかとしらべてみたら、やっぱりありました。generics を使いながら JDK1.4 で動かすやつが。
・Retroweaver
http://retroweaver.sourceforge.net/
クラスファイルを操作して generics 等を使ったクラスをJDK1.4でも動作可能に変換してくれるらしい。ライセンスも BSD-style license ということで心おきなく使える。
Ant での使い方も書いてあり、自分のビルドスクリプトに取り込むのもとても簡単。