如何在Scala 2.8注释中指定静态数组?

我一直在使用Hibernate Annotations 3.4.0在Scala 2.8.0中构建一些带注释的域类。 它一直工作正常,除了有一些注释将数组作为参数。 例如,这是我想在Scala中表达的Java注释:

@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=) @OneToMany(mappedBy="passport_id", cascade={CascadeType.PERSIST}) 

…但不幸的是,我已经达到了对Scala / Java注释的理解。 感谢帮助。

我将从规范中添加一些片段来解释为什么Rex的解决方案有效。

对于JVM上的Scala,将在生成的类中保留的注释参数必须是常量表达式:

从trait scala.ClassfileAnnotationinheritance的注释类的实例将存储在生成的类文件中。 …此外,在Java和.NET上,所有构造函数参数都必须是常量表达式。

什么是常量表达式?

6.24常量表达式常量表达式是Scala编译器可以计算为常量的表达式。 “常量表达式”的定义取决于平台,但它们至少包括以下forms的表达式:

  • 值类的文字,例如整数
  • 字符串文字
  • 使用Predef.classOf构建的类(第12.4节)
  • 来自底层平台的枚举元素
  • 一个文字数组,格式为Array(c1,…,cn),其中所有ci本身都是常量表达式
  • 由常量值定义(第4.1节)定义的标识符。

您还应该能够将参数重构为final val 。 但是,这似乎不适用于Arrays。 我会提出一个错误。

 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 

来自Rex Kerr:

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

这很有效。 谢谢。