【发布时间】:2020-04-15 13:45:35
【问题描述】:
我一直在努力理解 Java 语言规范中的 AnnotationTypeDeclaration。 https://docs.oracle.com/javase/specs/jls/se14/html/jls-9.html#jls-AnnotationTypeElementDeclaration
上面写着:
AnnotationTypeElementDeclaration:
{AnnotationTypeElementModifier} UnannType Identifier ( ) [Dims] [DefaultValue]
根据这个签名——Dims 表达式可以放在Identifier 和defaultValue 之间,这样写一个注释元素似乎是合法的:
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 语言的好奇心。我可以想到它的几个含义,但语法看起来太奇怪了,无法推理。提前致谢!
【问题讨论】:
-
这对我来说编译得很好。第一个 sn-p 中的
@Required注释了额外(数组)维度[]。局部数组变量的等价物是int @Required [] ids;或常规方法public int method() @Required [](或public int @Required [] method())。反射不允许您访问其中一些,更多用于注释处理器和静态分析工具。 -
@SotiriosDelimanolis 所以,
String value() [];在功能上与String[] value();相同? -
如果不清楚,您的第一个 sn-p 是一个注释元素,其返回类型为
String[],而不是String。 -
@VGR 是的,没错。
-
@SotiriosDelimanolis 感谢您的快速回答!请发表您的想法作为答案,以便我接受。点赞还不够;)
标签: java annotations jls