注释参数:显式与隐式字符串数组

时间:2014-01-21 08:10:26

标签: java arrays string annotations

为什么我的方案中的第二个测试在The value for annotation attribute SuppressWarnings.value must be an array initializer行上有语法错误SuppressWarnings

public class AnnotationTest {
    private static final String supUnused = "unused";
    private static final String supDeprecation = "deprecation";
    private static final String[] suppressArray = { "unused", "deprecation" };

    public static void main(String[] args) {
        // Test 1
        @SuppressWarnings( { supUnused, supDeprecation } )
        int a = new Date().getDay();

        // Test 2
        @SuppressWarnings(suppressArray)    // syntax error
        int b = new Date().getDay();
    }
}

如果您将参数作为两个单一常量传递,则可以正常工作 如果您使用数组常量传递它,则会出现语法错误。

此错误的解释是什么?

1 个答案:

答案 0 :(得分:5)

  

如果您使用数组常量传递它,则会出现语法错误。

注释参数必须是常量。

suppressArray被声明为final,但这仅表示您无法将suppressArray变量重新分配给另一个数组引用。您仍然可以更改suppressArray的内容,例如

suppressArray[0] = "someOtherString";

在第一个示例中,您使用内联数组初始值设定项。

@SuppressWarnings( { supUnused, supDeprecation } )

因此,没有其他类可以获取对它的引用,因此无法更改数组的内容。

至少看一下JLS 9.7.1会给出详细解释。

注释参数是名称值对,其中T是名称值对的类型,而V是值:

  
      
  • 如果T是基本类型或字符串,则V是常量表达式(第15.28节)。
  •   
  • V不为空。
  •   
  • 如果T是Class,或者是Class的调用,而V是类文字(第15.8.2节)。
  •   
  • 如果T是枚举类型,则V是枚举常量。
  •   

  

ElementValueArrayInitializer类似于普通数组初始值设定项(第10.6节),但允许使用注释代替表达式。

相关问题