interface を実装した enum のコンパイル時にシンボルが見つかりませんとか言われた

現象

interface を implements した enum を作って eclipse から Ant ビルドかけたら javac でシンボルが見つかりませんとか言われてこけた。 eclispe のコンパイルではエラー出てないのに。

環境

Jdk
1.5.0_11
Eclipse
3.6
OS
WindowsXP SP3 32bit

まだ 3.6 使ってんのかと言われると言葉もない。 Java のバージョンもなんか中途半端だし・・。

対策

意味がわからんのでとりあえず念力発動。 enum の各要素で interface のメソッドを直接実装するんじゃなくて、いったん abstract 定義したやつを各要素でオーバーライドするようにしたら Ant ビルドが通った。理屈はわからんけどなんとなくやってみた的な。

具体的には、以下のようにしてたのを

public enum Foo implements Bar {

	HOGE {
		// Bar のメソッド
		public void method() {
		}
	};

}

次のようにした。

public enum Foo implements Bar {

	HOGE {
		// Bar のメソッド
		@Override
		public void method() {
		}
	};

	public abstract void method();
}

なんだったのか

あとで調べてみたら次のページが見つかった。 javac のバグくさい。

コンパイル順序の問題とかなかなか痛いな。バグレポートにいくつか対策が書いてあるけど、たぶん abstract メソッドを定義する方法が一番まともっぽい。んー、こういうことがあるのね。 javac のバグ踏んだのは初めてだ。