現象
interface を implements した enum を作って eclipse から Ant ビルドかけたら javac でシンボルが見つかりませんとか言われてこけた。 eclispe のコンパイルではエラー出てないのに。
環境
まだ 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 のバグ踏んだのは初めてだ。