【问题标题】:Xtend compilation issues with static nested interfaces静态嵌套接口的 Xtend 编译问题
【发布时间】:2016-02-16 18:04:22
【问题描述】:

我已经尝试解决这个非常奇怪的错误好几个小时了,但我根本想不通。

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

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

【问题讨论】:

标签: java eclipse xtext xtend


【解决方案1】:

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

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

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

我猜这是Xtend编译器的bug,对应的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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    相关资源
    最近更新 更多