ECJの挙動にはまった
ふだんEclipseを使うことがないので知らなかったのだが、Eclipse上でJavaプログラムをコンパイルする場合、外部のJDKではなくてECJが使われるそうだ。困ったことにOracleのJDKのコンパイラとECJの動作は完全には一致していない。Eclipseで開発されたJavaプログラムのソースをOracleのJDKでコンパイルしようとしたらコンパイルエラーとなってしまった。問題のソースはこんな感じ。
import java.util.HashMap; public class Foo { private HashMap bar = { HashMap bar = new HashMap(); bar.put("key", "value"); }; }
明らかにJavaの文法に違反するのでエラーとなって当然なのだが、Eclipseで作られたclassファイルを逆コンパイルすると、以下のコードと同等のものと解釈されているらしい。
public class Foo { private HashMap bar; { HashMap bar = new HashMap(); bar.put("key", "value"); } }
こんな解釈をするECJもECJだが、上のコードを見て疑問を感じない開発者もどうかしていると思うぞ。