我在处理Java注解时遇到了一些棘手的问题,因为它们的参数必须是"常量"。Scala 2.8语言规范的第6.24节指出,“常量表达式”可以是以下任何一种(重点在于):
- 值类别(如整数)的文字
- 字符串字面量
- 使用Predef.classOf(§12.5)构造的类
- 来自底层平台的枚举元素
- 形式为Array(c1,...,cn)的文字数组,其中所有ci本身都是常量表达式
- 由常量值定义(§4.1)定义的标识符。
现在,“字符串字面量”的定义似乎是以一种将其定义为只是一个用“”或“”“”“”括起来的字符块的方式进行的,这是非常明确的。那么我的问题是,为什么考虑到
object MyObject {
final val MY_CONSTANT1="foo"
final val MY_CONSTANT2="bar" + "baz"
final val MY_CONSTANT3="qux" + "quux" + "frobozz"
}
// ...
@MyAnnotation( ??? )
def Foo(): Unit {
...
@MyAnnotation
编译和 scaladoc 可以使用 MY_CONSTANT1 和 MY_CONSTANT2,但不能使用 MY_CONSTANT3(我收到“注释参数需要是常量”的消息)。为什么 MY_CONSTANT2 能正常工作?是因为有一个未指定的最多两个字符串字面值可以组合成一个更大字符串的规则在起作用,还是说我疯了?
编辑 我正在使用Scala 2.10版本,该版本似乎已经修复了之前Scala版本中与注释相关的编译器错误。