[英]Java annotations - Identifier or TypeName
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.