簡體   English   中英

Java - 如何創建僅適用於類型上下文的注釋類型? (PURE 類型注解)

[英]Java - How do I create an annotation type that is only applicable in type contexts? (PURE type annotation)

要創建適用於類型上下文的類型注釋,除了使用@Target(ElementType.TYPE_USE)對注釋類型進行元注釋之外,別無他法。 但是,由於 Java 設計者的錯誤決定,此注釋也適用於聲明上下文。

根據 Java SE 文檔,內容如下:

常量TYPE_USE對應於 JLS 4.11 中的類型上下文,以及兩個聲明上下文:類型聲明(包括注解類型聲明)和類型參數聲明。

例如,使用@Target(ElementType.TYPE_USE)元注釋類型的注釋可以寫在字段的類型上(或者在字段的類型內,如果它是嵌套、參數化或數組類型),並且也可以作為修飾符出現,例如,class 聲明。

TYPE_USE常量包括類型聲明和類型參數聲明,以方便類型檢查器的設計者為注釋類型提供語義。 For example, if the annotation type NonNull is meta-annotated with @Target(ElementType.TYPE_USE) , then @NonNull class C {...} could be treated by a type checker as indicating that all variables of class C are non-null ,同時仍然允許其他類的變量為非空或非非空,這取決於@NonNull是否出現在變量的聲明中。

盡管如此,我相信TYPE_USE最初打算在JLS 4.11中描述的 16 種類型上下文中使用。 但是 Java 設計者決定將其使用擴展到聲明上下文。

我想知道:

  • 當您可以通過向@Target注釋添加更多元素來擴展注釋的適用性時,他們到底為什么會做出這個決定。 除了“方便”之外還有什么具體原因嗎?
  • 如何創建僅適用於類型上下文的注釋類型? (又名。純類型注釋)

關於您的第一個問題,@Sweeper 給出了原因。 通常,寫在類型聲明上的類型注釋被視為適用於該類型的每次使用。 這是一個常見的習慣用法,要求每個注解設計者都擴展@Target注解會很麻煩。 此外,寫@Target({TYPE_USE, TYPE})會產生誤導,因為它聲明了一個既是類型注釋又是聲明注釋的注釋,這不是設計者的目標,並且與設計者的目標具有不同的含義。

這是 Java 設計的另一個優勢。 在字段或方法聲明中,Java 將聲明上的聲明注釋與字段類型或方法返回類型上的類型注釋區分開來。 在 class 聲明上編寫TYPE_USE注釋的能力提供了一種類似的方法來區分在 class 聲明上編寫的注釋的意圖和目的。

關於您的第二個問題,您可以編寫一個注釋處理器,當在您希望禁止的位置寫入注釋時發出錯誤。 您已經在使用注解處理器來強制執行類型注解的語義,因此您只需對其進行調整。

暫無
暫無

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

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