LoginSignup
5
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2012-09-07

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

5
4
11

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4