数组常量(字段)作为注释值
Array Constants (Fields) as Annotation Values
虽然这段代码可以顺利编译(使用 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
数组 在技术上是 一个编译时常量,为什么此代码导致错误?就个人而言,我认为这是非常违反直觉的,因为编译器简单地内联这个数组实际上并没有太大的痛苦。
我刚刚意识到它们(不出所料)也不能用作注释 values,而它们在 Scala 中的两种情况下都有效。
COMMONS
是一个数组,因此不是 compile-time constant。只有字符串和原语可以成为编译时常量表达式的一部分。您必须考虑 static final
数组仍然是可变的。
示例中的默认值不是标准数组,它是一种称为 ElementValueArrayInitializer
(JLS 9.7.1) 的特殊语言结构。
虽然这段代码可以顺利编译(使用 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
数组 在技术上是 一个编译时常量,为什么此代码导致错误?就个人而言,我认为这是非常违反直觉的,因为编译器简单地内联这个数组实际上并没有太大的痛苦。
我刚刚意识到它们(不出所料)也不能用作注释 values,而它们在 Scala 中的两种情况下都有效。
COMMONS
是一个数组,因此不是 compile-time constant。只有字符串和原语可以成为编译时常量表达式的一部分。您必须考虑 static final
数组仍然是可变的。
示例中的默认值不是标准数组,它是一种称为 ElementValueArrayInitializer
(JLS 9.7.1) 的特殊语言结构。