我一直在努力解决这个非常奇怪的错误几个小时,我根本想不出来。
我在Eclipse的项目中的Xtend源文件中有以下代码:
interface Apple {
def void test() {}
static interface Green extends Apple {
override test() {
Apple.super.test();
}
}
}
由于某种原因,上面的代码中的关键字“super”出现编译错误:
Java问题:无法访问Apple类型的封闭实例 范围
在检查Xtend产生的Java源代码时,我发现它创建的嵌套接口是非静态的,并且使用关键字“this”而不是“super”,这显然会导致此错误。 / p>
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。
编辑:我应该注意,我知道上面的代码似乎在语义上毫无意义,并且鉴于该方法是继承的,显然是不必要的。但是,这是我实际的,更实用的代码的简化案例。
答案 0 :(得分:1)
它将嵌套接口创建为非静态
嵌套接口始终为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()