Как я указываю статический массив в аннотации Scala 2.8?

Я пристраивал некоторые аннотируемые доменные классы в Scala, 2.8.0 использований В спящем режиме Аннотации 3.4.0. Это хорошо работало, за исключением того, что существуют определенные аннотации, которые берут массив в качестве параметра. Например, вот аннотация Java, которую я хочу выразить в Scala:

@OneToMany(mappedBy="passport_id", cascade=CascadeType.PERSIST)

Однако аннотация требует массива/набора, как введено:

[ERROR] .../Passport.scala:50: error: type mismatch; 
[INFO]  found   : javax.persistence.CascadeType(value PERSIST)
[INFO]  required: Array[javax.persistence.CascadeType]
[INFO]     @OneToMany(mappedBy="passport_id", cascade=CascadeType.PERSIST)

Я попробовал различные круглые скобки, квадрат/угол/фигурные скобки, и так далее:

@OneToMany(mappedBy="passport_id", cascade=(CascadeType.PERSIST))
@OneToMany(mappedBy="passport_id", cascade=[CascadeType.PERSIST])
@OneToMany(mappedBy="passport_id", cascade=<CascadeType.PERSIST>)
@OneToMany(mappedBy="passport_id", cascade={CascadeType.PERSIST})

... но к сожалению я достиг конца своего понимания аннотаций Scala/Java. Справка ценится.

11
задан oxbow_lakes 15 March 2010 в 16:20
поделиться

2 ответа

Я добавлю несколько фрагментов из спецификации , чтобы объяснить, почему решение Рекса работает.

Для Scala на JVM аргументы аннотаций, которые будут сохраняться в сгенерированном классе, должны быть постоянными выражениями:

Экземпляры класса аннотаций, наследующего от признака scala.ClassfileAnnotation, будут сохранены в сгенерированном файлы классов. ... Кроме того, как на Java, так и на .NET все аргументы конструктора должны быть постоянными выражениями.

Что такое постоянные выражения?

6.24 Выражения констант Выражения констант - это выражения, которые компилятор Scala может вычислить как константу . Определение «выражения константы » зависит от платформы , но они включают, по крайней мере, выражения следующих форм:

  • Литерал класса значений, например как целое число
  • Строковый литерал
  • Класс, созданный с помощью Predef.classOf (§12.4)
  • Элемент перечисления базовой платформы
  • Литеральный массив вида Array (c1,. ..., cn), где все ci сами являются постоянными выражениями
  • Идентификатор, определяемый определением постоянного значения (§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
14
ответ дан 3 December 2019 в 05:12
поделиться

От Рекса Керра:

@OneToMany(mappedBy="passport_id", cascade=Array(CascadeType.PERSIST))

Это сработало. Спасибо.

8
ответ дан 3 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: