虽然这段代码很乐意编译(使用Java 8 / Eclipse编译器)
public @interface specialized
{
public Class[] value() default { int.class, long.class, float.class, double.class };
}
重构它以使用常量而不是数组会导致错误:
public @interface specialized
{
public static final Class[] COMMONS = { int.class, long.class, float.class, double.class };
public Class[] value() default COMMONS;
// ^ The value for annotation attribute specialized.value must be a class literal
}
我知道注释值和-defaults必须是编译时常量,但是虽然COMMONS
数组在技术上是编译时常量,但为什么这段代码会导致错误?就个人而言,我认为这是非常反直觉的,因为编译器简单地内联这个数组实际上并不是太痛苦。
我刚刚意识到他们(不出所料)不能作为注释值工作,而它们在Scala中都适用于这两种情况。
答案 0 :(得分:3)
COMMONS
是一个数组,因此不是compile-time constant。只有字符串和基元才能成为编译时常量表达式的一部分。您必须考虑static final
数组仍然是可变的。
示例中的默认值不是标准数组,它是一种名为ElementValueArrayInitializer
(JLS 9.7.1)的特殊语言结构。