2011-12-08 62 views
4

我一直無法理解確切的註釋必須或可以放置。Java註釋:在變量初始化時,但沒有賦值?

這種方法的類編譯,但會發出警告「未登記」:

<B extends BitSet> void doStuff(LinkedList<B> list) { 
    B board = list.getFirst(); 
    B cloneBoard; 
    cloneBoard = (B) board.clone(); //unchecked 
} 

這編譯沒有警告:

<B extends BitSet> void doStuff(LinkedList<B> list) { 
    B board = list.getFirst(); 

    @SuppressWarnings("unchecked") 
    B cloneBoard = (B) board.clone(); 
} 

這並不編譯,但痕跡cloneBoard一個錯誤:

<B extends BitSet> void doStuff(LinkedList<B> list) { 
    B board = list.getFirst(); 
    B cloneBoard; 

    @SuppressWarnings("unchecked") 
    cloneBoard = (B) board.clone(); // cloneBoard cannot be resolved to a type; 
            // VariableDeclaratorID expected 
} 

在關於註釋的Sun教程中,我無法找到答案至於爲什麼這是:http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html

語法定義也幫不了我,因爲我不是很確定我理解正確的話:http://java.sun.com/docs/books/jls/third_edition/html/syntax.html#18.1

在我看來,這有什麼問題就在這裏是註釋可專門用於變量,但只有當他們宣佈時;以後的任務不會被註解所覆蓋。它是否正確?有沒有比整個方法抑制未經檢查的警告更優雅的解決方案?

+0

哇,你的回答比我預想的要快得多,謝謝!他們都很有幫助;我接受了ruakh的一個優雅(尤其是代碼部分)的有用部分的答案。 –

回答

2

註解是聲明的一部分;就像你不能寫Object obj除了宣佈obj的地方,也不能final obj除了final Object obj,因此@Deprecated obj也是禁止的。

至於優雅—理想情況下,你的方法不應該很長也很複雜,但是如果你發現你想用這個註解標記一個特定的賦值,你總是可以使用一個簡單的包裝方法:

@SuppressWarnings("unchecked") 
private static <T extends ClassThatDeclaresCloneAsPublic> T cloneObj(T obj) 
    { return (T) obj.clone(); } 

(儘管在這種特殊情況下,我想你可以寫cloneBoard = board.getClass().cast(board.clone());並完全與註釋免除,如果你想。)

+0

如果你想知道爲什麼你今天再次得到+15,我很好奇在這麼長時間之後是否真的有可能「不接受」答案:P –

1

註解是聲明的一部分(其他人已經回答了這部分內容)。

但是,要回答您的問題的第二部分: 當這種方法很短時,我從來沒有用這個註釋標記整個方法的問題。我個人更喜歡對方法/類級別的註釋,而不是方法內部的註釋,因爲我認爲它們只是分散讀者的注意力。