声明注解和类型注解的区别
Difference between declaration annotations and type annotations
Java 8 引入了 JSR308 类型注释。根据 Java 语言规范
type annotations can be used anywhere a type is used, such as
declarations, generic arguments, casts etc.
我对Java比较陌生,Java8是我使用的第一个java版本,所以对非'type annotations'不熟悉,即声明注释。
声明注释与类型注释有何不同?我想知道,因为我一直在手册中听到它们,看起来 'type annotations' 是 'declaration annotations' 的超集。
现在大多数注解都是声明注解,例如@Override
:
class Foo implements Runnable {
@Override // applies to the declaration of Foo.run()
public void run() {
}
}
类型注释将可能的注释目标扩展到 非 声明类型(强制转换、类型参数等)的使用。类型注解可以出现in 声明,但类型注解不是声明注解的超集。例如,@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 编译器。
类型注解和声明注解在Java中仍然存在,并且它们是不同的并且不重叠。
类型注解可以写在任何使用类型上。
它在概念上创建了一个新的、更具体的类型。
也就是说,它描述了该类型代表的值。
例如,int
类型包含值 ..., -2, -1, 0, 1, 2, ...
@Positive int
类型包含值 1、2、...
因此,@Positive int
是 int
.
的子类型
声明注释可以写在任何声明(class、方法或变量)上。它描述了被声明的东西,但没有描述 运行-时间值。以下是声明注释的示例:
@Deprecated
class MyClass { ... }
表示程序员不应该使用MyClass
。
@Override
void myMethod() { ... }
表示 myMethod
覆盖了 superclass 或接口中的声明。
@SuppressWarnings(...)
int myField = INITIALIZATION-EXPRESSION;
表示编译器不应针对初始化表达式中的代码发出警告。
以下是同时使用声明注释和类型注释的示例:
@Override
@NonNull String myMethod() { ... }
@GuardedBy("myLock")
@Regex String myField;
请注意,类型注释描述值,声明注释说明字段的方法或用途。
作为一种风格,声明注释写在自己的行上,类型注释直接写在类型之前,在同一行上。
Java 8 引入了 JSR308 类型注释。根据 Java 语言规范
type annotations can be used anywhere a type is used, such as declarations, generic arguments, casts etc.
我对Java比较陌生,Java8是我使用的第一个java版本,所以对非'type annotations'不熟悉,即声明注释。
声明注释与类型注释有何不同?我想知道,因为我一直在手册中听到它们,看起来 'type annotations' 是 'declaration annotations' 的超集。
现在大多数注解都是声明注解,例如@Override
:
class Foo implements Runnable {
@Override // applies to the declaration of Foo.run()
public void run() {
}
}
类型注释将可能的注释目标扩展到 非 声明类型(强制转换、类型参数等)的使用。类型注解可以出现in 声明,但类型注解不是声明注解的超集。例如,@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 编译器。
类型注解和声明注解在Java中仍然存在,并且它们是不同的并且不重叠。
类型注解可以写在任何使用类型上。 它在概念上创建了一个新的、更具体的类型。 也就是说,它描述了该类型代表的值。
例如,int
类型包含值 ..., -2, -1, 0, 1, 2, ...
@Positive int
类型包含值 1、2、...
因此,@Positive int
是 int
.
声明注释可以写在任何声明(class、方法或变量)上。它描述了被声明的东西,但没有描述 运行-时间值。以下是声明注释的示例:
@Deprecated
class MyClass { ... }
表示程序员不应该使用MyClass
。
@Override
void myMethod() { ... }
表示 myMethod
覆盖了 superclass 或接口中的声明。
@SuppressWarnings(...)
int myField = INITIALIZATION-EXPRESSION;
表示编译器不应针对初始化表达式中的代码发出警告。
以下是同时使用声明注释和类型注释的示例:
@Override
@NonNull String myMethod() { ... }
@GuardedBy("myLock")
@Regex String myField;
请注意,类型注释描述值,声明注释说明字段的方法或用途。
作为一种风格,声明注释写在自己的行上,类型注释直接写在类型之前,在同一行上。