【问题标题】:Difference between declaration annotations and type annotations声明注解和类型注解的区别
【发布时间】:2018-05-01 15:16:35
【问题描述】:

Java 8 在 JSR308 中引入了类型注解。根据Java语言规范

类型注解可以在任何使用类型的地方使用,例如 声明、泛型参数、强制类型转换等。

我对 Java 比较陌生,Java 8 是我使用的第一个 Java 版本,所以我不熟悉非“类型注释”,即声明注释。

声明注解与类型注解有何不同?我想知道,因为我一直在手册中听到它们,看起来“类型注释”是“声明注释”的超集。

【问题讨论】:

    标签: java annotations jls type-annotation


    【解决方案1】:

    Java 中仍然存在类型注解和声明注解,并且它们是不同的且不重叠的。

    type annotation 可以写在 type 的任何用途上。 它在概念上创建了一种新的、更具体的类型。 也就是说,它描述了该类型所代表的值。

    例如,int 类型包含值 ...、-2、-1、0、1、2、...
    @Positive int 类型包含值 1、2、...
    因此,@Positive intint 的子类型。

    声明注释可以写在任何声明(类、方法或变量)上。它描述了被声明的东西,但不描述运行时值。以下是声明注释的示例:

    @Deprecated
    class MyClass { ... }
    

    说程序员不应该使用MyClass

    @Override
    void myMethod() { ... }
    

    表示myMethod 覆盖了超类或接口中的声明。

    @SuppressWarnings(...)
    int myField = INITIALIZATION-EXPRESSION;
    

    表示编译器不应在初始化表达式中发出有关代码的警告。

    以下是同时使用声明注释和类型注释的示例:

    @Override
    @NonNull String myMethod() { ... }
    
    @GuardedBy("myLock")
    @Regex String myField;
    

    请注意,类型注释描述了值,而声明注释说明了该字段的方法或使用。

    作为一种风格,声明注释写在自己的一行上,类型注释直接写在类型之前,在同一行。

    【讨论】:

      【解决方案2】:

      现在大部分注解都是声明注解,例如@Override:

      class Foo implements Runnable {
          @Override // applies to the declaration of Foo.run()
          public void run() {
          }
      }
      

      类型注解将可能的注解目标扩展到声明类型的使用(类型转换、类型参数等)。类型注解可以出现在 声明中,但类型注解不是声明注解的超集。例如,@Override 绝不是类型注释。

      在不明确的情况下,例如@Foo int x;JLS §9.7.4 outlines specific rules for whether it's the declaration or type that's considered to be annotated。在某些情况下,它甚至被视为两者兼而有之。

      以下是一些明确的类型注释示例:

      // cast
      String str = (@Foo String) take();
      // type argument
      List<@Foo String> list = new ArrayList<>();
      

      我想我还可以补充一点,目前类型注释的问题是没有官方 API 可以让注释处理器(基本上是编译器插件)对它们做任何有意义的事情。因此,类型注释通常只被第三方工具使用,例如 Lombok 和 Eclipse 编译器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多