簡體   English   中英

Java批注:在變量初始化時,而不是賦值時?

[英]Java annotations: at variable initialization, but not assignment?

我一直在理解必須在哪里或可以放置注釋的確切位置上遇到麻煩。

帶有該方法的類可以編譯,但會發出“未選中”警告:

<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

在我看來,這里的問題是注釋可以專門用於變量,但只能在聲明時使用。 以后的任何分配都不會被注釋覆蓋。 它是否正確? 是否有比抑制整個方法的未經檢查的警告更優雅的解決方案?

來自Java語言規范-接口>注釋

注釋可以在任何聲明中用作修飾符,無論是包,類,接口,字段,方法,參數,構造函數還是局部變量。

它只能在聲明中使用。

注釋是聲明的一部分; 就像您不能在聲明obj那點寫Object obj一樣,也不@Deprecated 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());並根據需要完全省去注釋。)

注釋是聲明的一部分(其他人已經回答了這一部分)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM