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

时间:2010-03-15 15:40:17

标签: java scala annotations 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=<CascadeType.PERSIST>)
@OneToMany(mappedBy="passport_id", cascade={CascadeType.PERSIST})

...但不幸的是,我已经完成了对Scala / Java注释的理解。感谢帮助。

2 个答案:

答案 0 :(得分:14)

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

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

  

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

什么是常量表达式?

  

6.24 常量表达式常量表达式是表达式   Scala编译器可以评估为   不变。 “常数。”的定义   表达“取决于平台,   但它们至少包含了   表达式如下:

     
      
  • 值类的文字,例如整数
  •   
  • 字符串文字
  •   
  • 使用Predef.classOf(第12.4节)
  • 构建的类   
  • 来自底层平台的枚举元素
  •   
  • 一个文字数组,格式为Array(c1,...,cn),其中all   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

答案 1 :(得分:8)

来自Rex Kerr:

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

这很有用。感谢。