静态嵌套接口的 Xtend 编译问题
Xtend compilation issues with static nested interfaces
几个小时以来,我一直在尝试解决这个非常奇怪的错误,但我就是想不通。
我在 Eclipse 的一个项目中的 Xtend 源文件中有以下代码:
interface Apple {
def void test() {}
static interface Green extends Apple {
override test() {
Apple.super.test();
}
}
}
由于某种原因,我在上面的代码中遇到关键字 "super" 的编译器错误:
Java problem: No enclosing instance of the type Apple is accessible in
scope
在检查 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.
编辑: 我应该注意,我知道上面的代码似乎在语义上毫无意义,并且鉴于该方法是继承的,显然是不必要的。然而,这是我实际的、更实用的代码的简化案例。
it is creating the nested interface as non-static
嵌套接口总是 static
因此您指定的显式 static
修饰符是多余的。
(所以 Xtend 编译器在这里是正确的。)
using the keyword "this" instead of "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()
几个小时以来,我一直在尝试解决这个非常奇怪的错误,但我就是想不通。
我在 Eclipse 的一个项目中的 Xtend 源文件中有以下代码:
interface Apple {
def void test() {}
static interface Green extends Apple {
override test() {
Apple.super.test();
}
}
}
由于某种原因,我在上面的代码中遇到关键字 "super" 的编译器错误:
Java problem: No enclosing instance of the type Apple is accessible in scope
在检查 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.
编辑: 我应该注意,我知道上面的代码似乎在语义上毫无意义,并且鉴于该方法是继承的,显然是不必要的。然而,这是我实际的、更实用的代码的简化案例。
it is creating the nested interface as non-static
嵌套接口总是 static
因此您指定的显式 static
修饰符是多余的。
(所以 Xtend 编译器在这里是正确的。)
using the keyword "this" instead of "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()