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

Java 14语言规范注释元素解释-可能是打字错误?,java,annotations,jls,Java,Annotations,Jls,我一直在努力理解Java语言规范中的AnnotationTypeDeclaration。 内容如下: AnnotationTypeElementDeclaration: {AnnotationTypeElementModifier} UnannType Identifier ( ) [Dims] [DefaultValue] 根据此签名-可以在标识符和默认值之间放置Dims表达式,这样写注释元素似乎是合法的: package com.example.demo; 导入java.lang.an

我一直在努力理解Java语言规范中的AnnotationTypeDeclaration。

内容如下:

AnnotationTypeElementDeclaration:
{AnnotationTypeElementModifier} UnannType Identifier ( ) [Dims] [DefaultValue] 
根据此签名-可以在
标识符
默认值
之间放置
Dims
表达式,这样写注释元素似乎是合法的:

package com.example.demo;
导入java.lang.annotation.*;
@接口要求值{
字符串值()@Required[]默认值“默认值”;
}
@目标({ElementType.TYPE,ElementType.TYPE\u USE})
@所需接口{
}
但是,编译器会抛出以下错误:

Incompatible types. Found: 'com.example.demo.Required', required: 'java.lang.String @com.example.demo.Required []'
在努力修复此错误后,我得到了以下结果:

package com.example.demo;
导入java.lang.annotation.*;
@接口要求值{
必需值()@Required[]默认值@Required;
}
@目标({ElementType.TYPE,ElementType.TYPE\u USE})
@所需接口{
}
您很容易注意到,我必须将
value()
元素的类型更改为
Required
。现在代码编译时没有错误

也可以省略
defaultValue
定义

@接口RequiredValue{
必需值()@Required[]默认值@Required;
必需的名称()@Required[];
}

那么-有
Dims
@Required[]
在本例中)有什么意义?它有什么用?我没有看到一行Java代码实际上与上面的示例类似。我的问题仅仅源于Java语言规范和我对更好地了解Java语言的好奇心。我能想到它的几种含义,但语法看起来太奇怪,无法解释它们。提前谢谢

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

编辑:根据@Sotirios Delimanolis的说法,@Required注释适用于数组维度,因此它与返回类型
@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"};
}

P> >这只是java的一个怪癖。

< P>。因此,问题在于java语言本身是C++语言的替代,因此保留了C样式数组语法。

这对我来说很好。第一个代码段中的
@Required
正在注释额外(数组)维度
[]
。本地数组变量的等价项是
int@Required[]id
或对于常规方法
public int method()@Required[]
(或
public int@Required[]method()
)。反射不允许您访问其中的一些内容,注释处理器和静态分析工具使用了更多内容。@SotiriosDelimanolis So,
String value()[]
在功能上与
字符串[]值()相同?如果不清楚,您的第一个代码段是一个返回类型为
String[]
,而不是
String
@VGR是的,没错。@SotiriosDelimanolis谢谢您的快速回答!请把你的想法作为答案贴出来,这样我就可以接受了。向上投票是不够的;)这不太正确。根据
@Required
@Target
,在第二个代码段中,注释可能应用于整个返回类型、方法,但不应用于数组维度本身,这是第一个代码段所做的。我明白了。不过,我在JavaDocs中没有看到维度元素类型。这是如何工作的?
TYPE_USE
将在这里应用iirc。