是否可以在返回Type上添加注释

lea*_*eat 5 java annotations

我遇到了这段代码

@Override
public @NotNull Class<?> getProviderClass() {
    return this.getClass();
}
Run Code Online (Sandbox Code Playgroud)

我想知道它是否如下面的代码:

@Override
@NotNull
public Class<?> getProviderClass() {
    return this.getClass();
}
Run Code Online (Sandbox Code Playgroud)

注意:@NotNull注释位于相对于accessModifier的不同位置

在这种情况下还是在方法上返回类型的注释?

Rad*_*def 9

Java 8允许类型注释,即类似的东西@Foo int foo = (@Foo int) var;.

规范的摘要是它取决于如何@NonNull声明注释,特别是如何@Target指定注释.

  • 如果使用ElementType.TYPE_USE,则注释适用于返回类型.
  • 如果使用ElementType.METHOD,则适用于方法声明.
  • 如果它同时使用(或不使用),则它同时适用于返回类型和方法声明.

无论哪种方式,注释在语法上都是方法的修饰符,因此它的位置无关紧要.

因此,例如,如果@NonNull声明为类型注释,则是,您声明方法的返回值不应为null.

9.7.4:

注释可以出现在程序中的语法位置,它可以合理地应用于声明或类型,或两者兼而有之.这可能发生在五个声明上下文中的任何一个中,其中修饰符紧接在声明的实体的类型之前:

  • 方法声明(包括注释类型的元素)

  • 构造函数声明

  • 字段声明(包括枚举常量)

  • 正式和异常参数声明

  • 局部变量声明(包括for语句的循环变量和try-with-resources语句的资源变量)

Java编程语言的语法明确地将这些位置的注释视为声明的修饰符,但这纯粹是一种语法问题.注释是应用于声明还是应用于声明的实体的类型 - 因此,注释是声明注释还是类型注释 - 取决于注释类型的适用性:

  • 如果注释的类型适用于与声明相对应的声明上下文,而不适用于类型上下文,则注释仅被视为仅适用于声明.

  • 如果注释的类型适用于类型上下文,而不适用于与声明对应的声明上下文,则注释仅被视为仅适用于最接近注释的类型.

  • 如果注释的类型适用于与声明相对应的声明上下文类型上下文中,则注释被视为适用于声明和最接近注释的类型.

在上面的第二和第三种情况中,最接近注释的类型是用声明的实体的源代码编写的类型; 如果该类型是数组类型,则认为元素类型最接近注释.


lea*_*eat 6

@Annotation相对于accessModifier的位置无关紧要.注释是在方法上而不是在返回类型上.

我用JD-GUI编译和反编译这里是我的输入和输出

INPUT

public @NotNull Class<?> getProviderClass2() {
    return this.getClass();
}

@NotNull
public Class<?> getProviderClass1() {
    return this.getClass();
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

@NotNull
public Class<?> getProviderClass2()
{
  return getClass();
}

@NotNull
public Class<?> getProviderClass1()
{
  return getClass();
}
Run Code Online (Sandbox Code Playgroud)