数组常量(字段)作为注释值

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) 的特殊语言结构。