Java
Eclipse

ECJ (eclipse compiler for Java) bug. インナークラスのコンストラクタを外から無名クラスとして継承すると型エラー

More than 5 years have passed since last update.

この正しい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