Ответ 1
Я добавлю несколько фрагментов из spec, чтобы объяснить, почему решение Rex работает.
Для Scala на JVM аргументы аннотаций, которые будут сохранены в сгенерированном классе, должны быть постоянными выражениями:
Экземпляры класса аннотации, унаследовавшего от свойства scala.ClassfileAnnotation будет храниться в сгенерированных файлах классов.... Кроме того, на Java и .NET все аргументы конструктора должны быть постоянными выражениями.
Что такое постоянные выражения?
6.24 Константные выражения Константные выражения - это выражения, которые Scala компилятор может оценить постоянная. Определение "константа выражение" зависит от платформы, но они включают по крайней мере выражения следующих форм:
- Литерал класса значений, такого как целое число
- Строковый литерал
- Класс, построенный с помощью Predef.classOf(§12.4)
- Элемент перечисления с базовой платформы
- Литеральный массив формы Array (c1,..., cn), где все ci s сами по себе постоянны выражения
- Идентификатор, определяемый определением константы (§ 4.1).
Вы также должны иметь возможность реорганизовать аргумент на final val
. Однако это не работает для массивов. Я подниму ошибку.
class T(value: Any) extends ClassfileAnnotation
object Holder {
final val as = Array(1, 2, 3)
final val a = 1
}
@T(Holder.a)
@T(Holder.as) // annot.scala:9: error: annotation argument needs to be a constant; found: Holder.as
class Target