Java - 如何创建一个只适用于类型上下文的注解类型?(纯类型注解)

问题描述 投票:0回答:1

要创建一个适用于类型上下文的类型注解,除了用元注解类型之外,没有别的办法。@Target(ElementType.TYPE_USE). 然而,由于Java设计者的错误决定,这个注解在声明上下文中也变得适用。

根据Java SE文档,它的内容是这样的。

常量 TYPE_USE 对应于 JLS 4.11 中的类型上下文,以及两个声明上下文:类型声明(包括注解类型声明)和类型参数声明。

例如,一个注解的类型被元注释为 @Target(ElementType.TYPE_USE) 可以写在一个字段的类型上(或者在字段的类型中,如果它是一个嵌套的、参数化的或数组的类型),也可以作为一个修饰符出现,例如,一个类声明。

类声明中的 TYPE_USE 常量包括类型声明和类型参数声明,以方便类型检查器的设计者给注解类型赋予语义。例如,如果注解类型NonNull被元注解为带有 @Target(ElementType.TYPE_USE)那么 @NonNull class C {...} 类型检查器可以将其视为表明所有类 C 为非空,同时仍然允许其他类的变量为非空或不为非空,基于 @NonNull 在变量的声明处出现。

尽管如此,我相信 TYPE_USE 最初的目的是为了在16种类型上下文中使用,如在 JLS 4.11. 但Java设计者们做出了一个决定,将其用法扩展到声明上下文。

我很好奇,到底为什么他们要做出这个决定?

  • 他们到底为什么要做出这样的决定,因为你可以通过简单的添加更多元素来扩展注解的适用性。@Target 注释。除了 "方便 "之外,还有其他具体原因吗?
  • 我怎样才能创建一个只适用于类型上下文的注解类型?(也就是纯类型注解)
java annotations typechecking
1个回答
1
投票

关于你的第一个问题,@扫地僧给出了原因。 传统上,写在类型声明上的类型注解被视为适用于该类型的每一个使用。 这是一个很常见的习语,如果要求每个注解设计者都要扩展出这个注解,那就太麻烦了。@Target 注释。 此外,写 @Target({TYPE_USE, TYPE}) 将是 误导性,因为它声明了一个既是类型注解又是声明注解的注解,这不是设计者的目标,与设计者的目标意义不同。

这里是Java设计的另一个优点。 在一个字段或方法声明中,Java将声明上的声明注释与字段类型或方法返回类型的类型注释区分开来。 能够写一个 TYPE_USE 注解在类声明上给出了一个类似的方法来区分写在类声明上的注解的意图和目的。

关于你的第二个问题,你可以写一个注解处理器,当一个注解写在你希望禁止的位置时,它会发出一个错误。 你已经在使用注解处理器来执行类型注解的语义,所以你只需要对它进行调整。

© www.soinside.com 2019 - 2024. All rights reserved.