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

时间:2015-05-13 20:34:13

标签: java arrays annotations compile-time-constant

虽然这段代码很乐意编译(使用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中都适用于这两种情况。

1 个答案:

答案 0 :(得分:3)

COMMONS是一个数组,因此不是compile-time constant。只有字符串和基元才能成为编译时常量表达式的一部分。您必须考虑static final数组仍然是可变的。

示例中的默认值不是标准数组,它是一种名为ElementValueArrayInitializerJLS 9.7.1)的特殊语言结构。