この正しいJavaのコードが、eclipse上ではコンパイル時エラーになる。
C.java
public class C {
public class Inner extends C {}
public static void main(String[] args) {
new C().new Inner(){};
}
}
$ java -jar /Applications/eclipse/plugins/org.eclipse.jdt.core_3.8.1.v20120531-0637.jar C.java
----------
1. ERROR in /Users/keigoi/tmp/C.java (at line 9)
new C().new Inner(){};
^^^^^^^
No enclosing instance of type C is available due to some intermediate constructor invocation
----------
1 problem (1 error)
ソースを追ってみたが、何やら
new C().new Inner() {
x() {
super();
}
と展開され(xは無名クラスのコンストラクタか)、ここで super (つまりC.this.Inner())を呼び出そうにも外側クラスのインスタンスが無いから呼び出せないよ、という感じのようだった。実際にはnew C()のインスタンスを渡せればよいはずなのだけど…
追記:ちょっと違うみたい。Innerがenclosing class(ここではC)以外を継承していればコンパイル通る。
ここで報告した.
https://bugs.eclipse.org/bugs/show_bug.cgi?id=388903