2014-01-21 48 views
0

爲什麼我的方案中的第二個測試在SuppressWarnings行上的語法錯誤The value for annotation attribute SuppressWarnings.value must be an array initializer註釋參數:顯式與隱式字符串數組

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(); 
    } 
} 

如果您將參數作爲兩個單個常量傳遞,它將起作用。
如果您使用數組常量傳遞它,則會出現語法錯誤。

這個錯誤的解釋是什麼?

+0

[SuppressWarnings文檔】(http://docs.oracle.com/javase/7/docs/api/java/lang/SuppressWarnings.html)力量幫助 – Baby

+0

@RafaEl:謝謝你的文檔鏈接!關鍵是,我已經知道,你必須使用'SupressWarnings';) – bobbel

+0

是的,當然我知道你知道這一點。但..好吧,我不知道爲什麼我給你的鏈接:D – Baby

回答

5

如果您將它傳遞給數組常量,則會出現語法錯誤。

註釋參數必須是常量。

suppressArray宣佈爲final,但這隻意味着您不能將suppressArray變量重新分配給另一個數組引用。您仍然可以更改suppressArray的內容,例如

suppressArray[0] = "someOtherString"; 

在你的第一個例子中,你使用了一個數組初始化器內聯。

@SuppressWarnings({ supUnused, supDeprecation }) 

因此,沒有其他類可以獲得對它的引用,因此不能更改數組的內容。

至少看看JLS 9.7.1給出了詳細的解釋。

註釋arguements是名稱值對,其中T是名稱值對的類型而V是值:

  • 如果T是原始類型或字符串,並且V是一個常量表達式(§15.28)。
  • V不爲空。
  • 如果T是Class或Class的調用,並且V是類文字(第15.8.2節)。
  • 如果T是一個枚舉類型,並且V是一個枚舉常量。

一種ElementValueArrayInitializer是類似於正常數組初始化(第10.6節),除了註釋允許代替表達式。

+0

偉大而合理的答案!我一直在努力'必須是一個數組初始化'。因爲它實際上是一個數組初始值設定項,但方式不同......並且您的解釋顯示,爲什麼無法將數組傳遞給引用。謝謝! – bobbel