数小时以来,我一直在尝试解决这个非常奇怪的错误,但我根本无法弄清。
我在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()