【发布时间】:2013-11-25 04:05:03
【问题描述】:
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 而不是 MY_CONSTANT3 编译和 scaladocs(我得到“注释参数需要是常量”)。为什么 MY_CONSTANT2 完全有效?是否有一些未指定的最多两个字符串文字可以组合成一个更大的规则在工作,还是我疯了?
edit我使用的是 Scala 2.10,它似乎修复了早期 Scala 版本中一些与注释相关的编译器错误。
【问题讨论】:
-
请关闭问题 - 它适用于 scala 2.10+
-
如果它是“工作”(在这种情况下这意味着什么?),我不会遇到导致我提出问题的行为,所以不,我不会关闭问题.
-
您能否详细说明如何重现此内容?这在 2.10.2 中对我有用: object MyObject { final val MY_CONSTANT1="foo" final val MY_CONSTANT2="bar" + "baz" final val MY_CONSTANT3="qux" + "quux" + "frobozz" } case class NoopAnnotation( val param: String) 扩展 scala.annotation.StaticAnnotation @NoopAnnotation("ABC") def abc1() = 1 @NoopAnnotation(MyObject.MY_CONSTANT1) def abc2() = 1 @NoopAnnotation(MyObject.MY_CONSTANT2) def abc3() = 1 @NoopAnnotation(MyObject.MY_CONSTANT3) def abc4() = 1
-
我会尝试找一些时间 - 还没有发生。可能会在本周末发布有关该信息的更新。
标签: scala