2016-02-16 3 views
0

Я пытался решить эту очень странную ошибку в течение нескольких часов, и я просто не могу понять это.Проблемы с компиляцией Xtend со статическими вложенными интерфейсами

У меня есть следующий код в свой собственный исходный файл Xtend в проекте в Затмении:

interface Apple { 
    def void test() {} 
    static interface Green extends Apple { 
     override test() { 
      Apple.super.test(); 
     } 
    } 
} 

И по какой-то причине я получаю ошибку компиляции на ключевое слово «супер» в приведенном выше коде, который говорит:

проблема Java: нет ограждающий экземпляр типа Apple, не будет доступен в объеме

при осмотре т он исходный код Java, который производит Xtend, я вижу, что он создает вложенный интерфейс как нестатический, а также использует ключевое слово «this» вместо «super», что, очевидно, вызовет эту ошибку.

Xtend выход (переформатировать):

public interface Apple { 
    public default void test() {} 
    public interface Green extends Apple { 
     @Override 
     public default void test() { 
      Apple.this.test(); 
     } 
    } 
} 

Почему компилятор Xtend это делает?

Возможно, самая странная часть заключается в том, что выход компилятора является непоследовательным. Когда я переименовываю суперинтерфейс, исходный код Java, сгенерированный Xtend, изменяется семантически.

Я использую плагин Eclipse, Xtend для Xtend 2.9.0 с мишенью исток Java 8.

Edit: Я должен отметить, что я в курсе, что приведенный выше код, кажется, семантически бессмысленно, и, очевидно, не требуется, учитывая, что метод наследуется. Однако это упрощенный пример моего фактического, более практичного кода.

+0

походит Жук. можете ли вы подать билет? –

+0

Я сообщил об этой проблеме: https://bugs.eclipse.org/bugs/show_bug.cgi?id=487861 – snorbi

ответ

1

он создает вложенный интерфейс, как нестатические

Вложенных интерфейсы всегда static поэтому явный static модификатор Указано избыточный. (Таким образом, компилятор Xtend правильно здесь.)

, используя ключевое слово «это» вместо «супер»

Я предполагаю, что это ошибка компилятора 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()