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