簡體   English   中英

Java注釋 - 標識符或類型名稱

[英]Java annotations - Identifier or TypeName

Java語言規范聲明正常注釋采用格式

NormalAnnotation
@ TypeNameElementValuePairs opt

單元素注釋的格式為:

SingleElementAnnotation:
@ IdentifierElementValue

我不明白,為什么這種不一致,為什么正常注釋TypeName和單個元素注釋一個Identifier 我認為Identifier的引用可能是規范中的錯誤,因為標識符不是限定的,並且javac接受對於正常注釋和單個元素注釋都是合格的AnnotationDeclarations。

Identifier的引用是規范中的錯誤,因為標識符不能被限定(您可以編寫@java.lang.SuppressWarnings("unchecked")java.lang.SuppressWarnings不是合法標識符)。 對於普通注釋和單個元素注釋,Javac接受限定的AnnotationDeclarations。 這個錯誤似乎是最近出現的; 舊版本的JLS沒有這個問題。

我認為語法文檔中存在錯誤。 單個注釋元素和標記注釋是正常注釋的簡寫

您還可以看到Java 1.5 / 1.6規范: http//docs.oracle.com/javase/specs/jls/se5.0/html/interfaces.html#9.7

單元素注釋表示為:

SingleElementAnnotation:
    @ TypeName ( ElementValue )

教程指出Identifiers和TypeNames是兩回事。 從編程的角度來看,他們不是。 但從邏輯的角度來看,它們可能是正確的類比。

TypeName開始:數據類型(不計算原語)和類通常具有多個方法和/或屬性。 所以在某種程度上, TypeName有點像類的名稱或數據類型,它就是這種類型。

On to Identifier :標識符用於命名或描述ONE變量或ONE類。 在正確的上下文中,標識符可以與單個事物關聯,如int值,而TypeName可以在一個類中表示int和String。

int Identifier = 90; //Identifier represents an int value
class TypeName{
int i;
String s;
} //TypeName represents an int value and a String
TypeName MyNew = new TypeName(); //MyNew references to a TypeName, holding more
//than one value

這是非常謹慎的邏輯,所以如果邏輯對你來說乍一看沒有意義,作者可能為了清晰起見改變了名稱,使它們有點不同。 但無論作者怎么稱呼它們,它們都是一樣的,只是措辭不同。

這是一個語義問題(並且相當迂腐的語義)。

考慮一個NormalAnnotation ,例如@SuppressWarnings(value={"foo","bar")) ,其中SuppressWarnings (TypeName)解析為具有名為value的成員的注釋類。

現在考慮一個SingleElementAnnotation ,例如@SuppressWarnings({"foo","bar")) 標識符( SuppressWarnings接口的名稱,但沒有任何內容表明應將一個參數賦值給value

因此,您無法直接將該字符序列解析為NormalAnnotation ; 它沒有正確格式化的ElementValuePairs 但是,如果在左括號和參數的開頭之間插入value= ,則可以獲得可解析為NormalAnnotation的內容。

同樣適用於MarkerAnnotation。 它缺少NormalAnnotation所需的括號。

標識符需要是一個值,在NormalAnnotation中使用時將生成一個TypeName。

NormalAnnotation對它有許多限制,例如:

如果TypeName沒有在使用注釋的位置命名可訪問的注釋類型(第6.6節),那么這是一個編譯時錯誤。

在將SingleElementAnnotation或MarkerAnnotation轉換為NormalAnnotation之前, SuppressWarnings只是一個標識符,只需要符合Identifier的定義。 請注意,TypeNames可以是限定的,例如java.lang.SuppressWarnings ,但Identifiers不能。

我認為意圖是MarkerAnnotation和SingleElementAnnotation應該使用簡單名稱(標識符)而不是完全限定名稱(TypeNames)。 技術上講, @java.lang.Override @Override是可以的, @java.lang.Override是不正確的,但是@java.lang.Override()是允許的。 我能掌握的每個編譯器都允許后者。 這使得幾乎每個人的區別都沒有實際意義。

暫無
暫無

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

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