我在 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
使用 MY_CONSTANT1 和 MY_CONSTANT2 编译和 scaladocs,但不是 MY_CONSTANT3(我得到“注释参数需要是常量”)。为什么 MY_CONSTANT2 完全有效?是否有一些未指定的最多两个字符串文字可以组合成一个更大的规则在工作中,还是我疯了?
编辑我使用的是 Scala 2.10,它似乎修复了早期 Scala 版本中一些与注释相关的编译器错误。