Java 14 语言规范注释元素解释 - 可能是拼写错误?

Java 14 Language Specification Annotation Element Explanation - Possibly Typo?

我一直在努力理解 Java 语言规范中的 AnnotationTypeDeclaration。 https://docs.oracle.com/javase/specs/jls/se14/html/jls-9.html#jls-AnnotationTypeElementDeclaration

上面写着:

AnnotationTypeElementDeclaration:
{AnnotationTypeElementModifier} UnannType Identifier ( ) [Dims] [DefaultValue] 

根据这个签名 - Dims 表达式可以放在 IdentifierdefaultValue 之间,这样写注释元素似乎是合法的:

package com.example.demo;

import java.lang.annotation.*;

@interface RequiredValue {
    String value() @Required[] default "default value";
}

@Target({ElementType.TYPE, ElementType.TYPE_USE})
@interface Required {

}

但是,编译器报错如下:

Incompatible types. Found: 'com.example.demo.Required', required: 'java.lang.String @com.example.demo.Required []'

在努力修复这个错误之后,我得到了:

package com.example.demo;

import java.lang.annotation.*;

@interface RequiredValue {
    Required value() @Required[] default @Required;
}

@Target({ElementType.TYPE, ElementType.TYPE_USE})
@interface Required {

}

您很容易注意到,我必须将 value() 元素的类型更改为 Required。现在代码编译没有错误。

也可以省略 defaultValue 定义。

@interface RequiredValue {
    Required value() @Required[] default @Required;
    Required name() @Required[];
}

那么 - Dims(示例中的 @Required[])有什么意义?它有什么用?我还没有看到一行 Java 代码实际上看起来像上面的例子。我的问题只是源于 Java 语言规范和我想更好地了解 Java 语言的好奇心。我可以想到它的几种含义,但语法看起来太奇怪了,无法对它们进行推理。提前致谢!

您可以将 headers 之类的方法 public int[] sort(int[] arr) 替换为 public int sort(int arr[]) [] 之类的方法。两者是等价的。 Java 有一些奇怪的替代数组语法,因为它希望 C 程序员感到舒服。

编辑:根据@Sotirios Delimanolis 的说法,@Required 注释适用于数组维度,因此它与 return 类型的 @Required String[]

不太一样

所以你的注释是:

@interface RequiredValue {
    //Notice it's an array here              v
    String value() @Required[] default {"default value"};
}

基本上等同于:

@interface RequiredValue {
    @Required String[] value() default {"default value"};
}

这只是 Java 的怪癖。

总而言之,问题源于 Java 语言本身是 C++ 语言的替代品,因此保留了 C 风格的数组语法。