Как указать статический массив в аннотации Scala 2.8? - PullRequest
11 голосов
/ 15 марта 2010

Я строил некоторые аннотированные доменные классы в Scala 2.8.0, используя Hibernate Annotations 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. Помощь приветствуется.

Ответы [ 2 ]

14 голосов
/ 15 марта 2010

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

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

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

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

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

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

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

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

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

...