使用静态嵌套接口Xtend编译问题

时间:2016-02-16 05:58:32

标签: java eclipse xtext xtend

我一直在努力解决这个非常奇怪的错误几个小时,我根本想不出来。

我在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。

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

1 个答案:

答案 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()