Невозможно использовать значение java в качестве параметра для аннотации java в функции scala

У меня есть 3 java-файла: HW.java, myAnn.java и Constants.java в пакете myApp.

Константы.java:

public final class Constants {
    public static final String WORLD ="World";
}

myAnn.java:

public @interface myAnn {
    java.lang.String name() default "";
}

HW.java:

class HW {
    @myAnn(name = Constants.WORLD)
    public static void main(String[] args){
        System.out.println("Hi "+ Constants.WORLD);
    }
}

Мое приложение компилируется и работает нормально, как показано выше, но я хочу перенести HW.java на scala как HelloWorld.scala:

object HelloWorld {
  @myAnn(name = Constants.WORLD)
  def main(args: Array[String]) {
    println("Hello " + Constants.WORLD)
  }
}

Когда я пытаюсь скомпилировать это, я получаю

ошибка: аргумент аннотации должен быть константой; найдено: Constants.WORLD @myAnn(имя = Constants.WORLD)

Если я удалю аннотацию, то HelloWorld скомпилируется и выполнится, как и ожидалось.

Почему я могу использовать Constants.WORLD в качестве параметра аннотации из программы Java, но не из программы Scala? Есть ли что-то, что я могу изменить в Constants.java, чтобы его можно было использовать из java или scala? Я не могу изменить MyAnn.java и пока не могу перенести Constants.java.


person scalapeno    schedule 29.07.2011    source источник
comment
Какую версию Scala вы используете? У меня Scala 2.9.0.1 final, все компилируется и работает нормально. Кстати, было бы неплохо скомпилировать аннотацию отдельно от остального кода...   -  person agilesteel    schedule 30.07.2011
comment
Я использую 2.8.1.final - попробую обновить.   -  person scalapeno    schedule 01.08.2011
comment
Только что попробовал с 2.9.0.1, та же ошибка: scalac -version Версия компилятора Scala 2.9.0.1 -- Copyright 2002-2011, LAMP/EPFL scalac * HelloWorld.scala:4: ошибка: аргумент аннотации должен быть константой; найдено: Constants.WORLD @myAnn(имя = Constants.WORLD)   -  person scalapeno    schedule 02.08.2011


Ответы (1)


Это ошибка, которая проявляется только при передаче исходных файлов Java в компилятор scala, см. проблему СИ-2764. Пример работает при компиляции java-файлов сначала с использованием javac, а затем с указанием пути к классам scalac к сгенерированным файлам классов.

person Lukas Rytz    schedule 02.08.2011
comment
Теперь ошибка говорит, что она была исправлена ​​в Scala 2.10. - person ebruchez; 06.04.2013