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");
    }
}

こんな解釈をするECJECJだが、上のコードを見て疑問を感じない開発者もどうかしていると思うぞ。