数小时以来,我一直在尝试解决这个非常奇怪的错误,但我根本无法弄清。

我在Eclipse中的项目中自己的Xtend源文件中有以下代码:

interface Apple {
    def void test() {}
    static interface Green extends Apple {
        override test() {
            Apple.super.test();
        }
    }
}


由于某种原因,我在上述代码中的关键字“ super”上遇到编译器错误,该错误是:


Java问题:无法在其中访问Apple类型的封闭实例
范围


检查Xtend生成的Java源代码后,我发现它正在将嵌套接口创建为非静态接口,并使用关键字“ this”而不是“ super”,这显然会导致此错误。

Xtend输出(重新格式化):

public interface Apple {
    public default void test() {}
    public interface Green extends Apple {
        @Override
        public default void test() {
            Apple.this.test();
        }
    }
}


Xtend编译器为什么要这样做?

也许最奇怪的部分是编译器的输出不一致。当我重命名超级接口时,Xtend生成的Java源代码会在语义上发生变化。

我将Xtend 2.9.0的Eclipse Xtend插件与Java 8的源目标一起使用。

编辑:我应该注意,我知道上面的代码在语义上似乎毫无意义,并且鉴于该方法是继承的,因此显然是不必要的。但是,这是我实际的,更实际的代码的简化案例。

最佳答案

它正在将嵌套接口创建为非静态


嵌套接口始终为static,因此您指定的显式static修饰符是多余的。
(因此Xtend编译器在这里是正确的。)


使用关键字“ this”而不是“ super”


我猜这是一个Xtend编译器错误,相应的Java源代码按预期方式编译和执行:

interface AppleJava {
    default void test() {
        System.out.println("AppleJava.test()");
    }

    interface GreenJava extends AppleJava {
        @Override
        default void test() {
            AppleJava.super.test();
            System.out.println("GreenJava.test()");
        }
    }
}

class Test1 {
    public static void main(String[] args) {
        new AppleJava() {}.test();
        new AppleJava.GreenJava() {}.test();
    }
}


结果:

AppleJava.test()
AppleJava.test()
GreenJava.test()

10-08 01:33