Java 在省略号之前键入注释

Java 在省略号之前键入注释,java,annotations,type-annotation,Java,Annotations,Type Annotation,我在中看到,在省略号之前可以有注释: class X { void method(String @Annotation ... x) {} } 我的问题很简单:这意味着什么 特别是,与以下内容的区别是什么: class X { void method(@Annotation String ... x) {} } 注释可能出现在中的语法位置 一种程序,它可以合理地应用于声明或类型, 或者两者兼而有之 及 注释是应用于声明还是应用于 声明的实体-因此,注释是否为声明 注释或类型

我在中看到,在省略号之前可以有注释:

class X {
    void method(String @Annotation ... x) {}
}
我的问题很简单:这意味着什么

特别是,与以下内容的区别是什么:

class X {
    void method(@Annotation String ... x) {}
}

注释可能出现在中的语法位置 一种程序,它可以合理地应用于声明或类型, 或者两者兼而有之

注释是应用于声明还是应用于 声明的实体-因此,注释是否为声明 注释或类型注释-取决于 批注的类型:[……]

因此,中的注释

void method(String @Annotation ... x) {}
是一个注释

以及中的注释

void method(@Annotation String ... x) {}
既是一种
类型,又是一种注释


您可以验证这一点

@Target(value = ElementType.TYPE_USE)
@interface Annot {}
public static void method(String @Annot... arg) {}
public static void method2(@Annot String... arg) {}

注释可能出现在中的语法位置 一种程序,它可以合理地应用于声明或类型, 或者两者兼而有之

注释是应用于声明还是应用于 声明的实体-因此,注释是否为声明 注释或类型注释-取决于 批注的类型:[……]

因此,中的注释

void method(String @Annotation ... x) {}
是一个注释

以及中的注释

void method(@Annotation String ... x) {}
既是一种
类型,又是一种注释


您可以验证这一点

@Target(value = ElementType.TYPE_USE)
@interface Annot {}
public static void method(String @Annot... arg) {}
public static void method2(@Annot String... arg) {}


编写varargs形式参数时,例如

void method(String... x) {}
然后Java编译器生成一个接受字符串数组的方法;每当源代码使用多个参数调用该方法时,Java编译器都会在调用该方法之前将它们打包到一个数组中。因此,将像
String…
这样的声明视为类似于
String[]
。此外,注释的解释是相同的

这些注释中的任何一个

void method(String @NonEmpty ... x) {}
void method(String @NonEmpty [] x) {}
void method(@English String ... x) {}
void method(@English String [] x) {}
应用于数组:类型表示字符串的非空数组。注释说明数组或vararg列表不应为空。您可以使用注释处理器在编译时或运行时强制执行此操作

这些注释中的任何一个

void method(String @NonEmpty ... x) {}
void method(String @NonEmpty [] x) {}
void method(@English String ... x) {}
void method(@English String [] x) {}

应用于元素类型。注释记录了该方法采用英文字符串数组的情况。

当您编写varargs形式参数时,例如

void method(String... x) {}
然后Java编译器生成一个接受字符串数组的方法;每当源代码使用多个参数调用该方法时,Java编译器都会在调用该方法之前将它们打包到一个数组中。因此,将像
String…
这样的声明视为类似于
String[]
。此外,注释的解释是相同的

这些注释中的任何一个

void method(String @NonEmpty ... x) {}
void method(String @NonEmpty [] x) {}
void method(@English String ... x) {}
void method(@English String [] x) {}
应用于数组:类型表示字符串的非空数组。注释说明数组或vararg列表不应为空。您可以使用注释处理器在编译时或运行时强制执行此操作

这些注释中的任何一个

void method(String @NonEmpty ... x) {}
void method(String @NonEmpty [] x) {}
void method(@English String ... x) {}
void method(@English String [] x) {}

应用于元素类型。注释文档表明该方法采用了一个英文字符串数组。

啊,是的,我不知何故认为注释不能应用于数组,但它们当然可以。啊,是的,我不知何故认为注释不能应用于数组,但它们当然可以。