Isa*_*tes 11 java annotations scala scala-2.8
我使用Hibernate Annotations 3.4.0在Scala 2.8.0中构建了一些带注释的域类.它一直工作正常,只是有一些注释将数组作为参数.例如,这是我想在Scala中表达的Java注释:
@OneToMany(mappedBy="passport_id", cascade=CascadeType.PERSIST)
Run Code Online (Sandbox Code Playgroud)
但是,注释需要数组/集作为输入:
[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)
Run Code Online (Sandbox Code Playgroud)
我尝试了各种括号,方形/角度/花括号等,以此类推:
@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})
Run Code Online (Sandbox Code Playgroud)
...但不幸的是,我已经完成了对Scala/Java注释的理解.感谢帮助.
ret*_*nym 14
我将从规范中添加一些片段来解释为什么Rex的解决方案有效.
对于JVM上的Scala,将在生成的类中保留的注释参数必须是常量表达式:
从trait scala.ClassfileAnnotation继承的注释类的实例将存储在生成的类文件中....此外,在Java和.NET上,所有构造函数参数都必须是常量表达式.
什么是常量表达式?
6.24常量表达式常量表达式是Scala编译器可以计算为常量的表达式."常量表达式"的定义取决于平台,但它们至少包括以下形式的表达式:
- 值类的文字,例如整数
- 字符串文字
- 使用Predef.classOf构建的类(第12.4节)
- 来自底层平台的枚举元素
- 一个文字数组,其格式为Array(c1,...,cn),其中所有ci本身都是常量表达式
- 由常量值定义(第4.1节)定义的标识符.
您还应该能够将参数重构为a 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
Run Code Online (Sandbox Code Playgroud)
来自Rex Kerr:
@OneToMany(mappedBy="passport_id", cascade=Array(CascadeType.PERSIST))
Run Code Online (Sandbox Code Playgroud)
这很有效.谢谢.
| 归档时间: |
|
| 查看次数: |
3807 次 |
| 最近记录: |