声明注释和类型注释之间的区别

时间:2018-05-01 15:16:36

标签: java annotations jls type-annotation

Java 8使用JSR308引入了类型注释。根据Java语言规范

  

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

我相对较新的Java,Java 8是我使用的第一个java版本,所以我不熟悉非 - '类型的注释,即声明注释。 / p>

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

2 个答案:

答案 0 :(得分:1)

现在大多数注释都是声明注释,例如@Override

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

类型注释将可能的注释目标展开为使用 not 声明(强制转换,类型参数等)的类型。类型注释可以在声明中出现,但类型注释不是声明注释的超集。例如,@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编译器。

答案 1 :(得分:1)

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

类型注释可以在使用类型时编写。 它在概念上创建了一种新的,更具体的类型。 也就是说,它描述了类型代表的值。

例如,nodejs类型包含值..., - 2,-1,0,1,2,... path.basename('pathToFile') 类型包含值1,2,...
因此,int@Positive int的子类型。

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

@Positive int

说程序员不应该使用int

@Deprecated
class MyClass { ... }

表示MyClass会覆盖超类或接口中的声明。

@Override
void myMethod() { ... }

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

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

myMethod

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

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