我一直在使用 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=<CascadeType.PERSIST>)
@OneToMany(mappedBy="passport_id", cascade={CascadeType.PERSIST})
...但不幸的是我对 Scala/Java 注释的理解已经结束了。感谢帮助。
我将添加一些片段spec http://www.scala-lang.org/archives/downloads/distrib/files/nightly/pdfs/ScalaReference.pdf解释为什么雷克斯的解决方案有效。
对于 JVM 上的 Scala,将在生成的类中保留的注释参数必须是常量表达式:
继承自特征的注释类的实例
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)