为什么只对注释数组参数使用方括号就可以,而对方法参数则不行?
Why is it OK to only use brackets for annotation array argument, but not for method parameter?
好的,所以在 Java 语法中有一些我不太理解的东西让我有点困扰。
当注释接受数组作为其参数值之一时,我们可以通过在几个括号内提供值来实现,如下所示:
public @interface SomeAnnotation {
String[] someParam();
}
@SomeAnnotation(someParam = { "foo", "bar" })
public class Example {}
这是一种传递值数组的非常简洁明了的方法。喜欢。
但是在调用方法的时候同样不行:
public interface Example {
public static void someMethod(String[] someParam) {
// Do something
}
}
// ...
Example.someMethod({ "foo", "bar" }); // Syntax Error :(
从外观上看,注释的 someParam
和方法 someParam
都声明为 String[]
数组。
我想这与 Java 在幕后处理注释的方式有关,and/or 事实上 someParam
被声明为一种方法(在括号处结束)在 SomeAnnotation
,但仍然...为什么?
如果有人能对此有所了解,我将不胜感激。
请注意,我不是在寻找替代方案或解决方法,而是在寻找一些解释。
后续问题
我知道我可以使用 new String[]...
语法调用该方法,如下所示:
Example.someMethod(new String[] { "foo", "bar" });
但这对我来说也很奇怪,因为参数应该是 String
的数组,而括号内的值确实是 String
s。我希望编译器能够匹配并接受它。
简单的解释就是,这是指定Java语言的方式。为新的编程语言设计语法是表达力和简洁性与简单性/可读性和无歧义之间的折衷。
基本的 Java 语法是他们在 ~1995 年得出的。从那时起,Java 设计师一直受到隐含要求的约束,即对语言语法的任何更改都不能“破坏”旧代码1.
注释实际上就是一个很好的例子。 @ <Identifier>
语法标记创建了一个新的上下文,其中新规则不会干扰 Java 语法的旧部分。这使他们能够在新上下文中使用更简单/更清晰的方式来编写“数组文字”。所以他们做到了。但是他们不能更普遍地做同样的事情 2 而不会产生解析问题 and/or 破坏旧的 Java 代码。
1 - 或者任何破损都应该是最小的。例如,将 enum
更改为 Java 5 中的关键字破坏了使用“枚举”作为标识符的现有 Java 代码的一小部分。这引起了一些焦虑。因此,当他们在 Java 10 中引入 var
时,他们将其设为“保留类型名称”而不是完整关键字。
2 - 至少,我认为他们不能。如果他们能做到,我想他们 会 在过去 25 年左右的时间里做到了。大多数人都认为 Java 数组初始化有点笨拙。
好的,所以在 Java 语法中有一些我不太理解的东西让我有点困扰。
当注释接受数组作为其参数值之一时,我们可以通过在几个括号内提供值来实现,如下所示:
public @interface SomeAnnotation {
String[] someParam();
}
@SomeAnnotation(someParam = { "foo", "bar" })
public class Example {}
这是一种传递值数组的非常简洁明了的方法。喜欢。
但是在调用方法的时候同样不行:
public interface Example {
public static void someMethod(String[] someParam) {
// Do something
}
}
// ...
Example.someMethod({ "foo", "bar" }); // Syntax Error :(
从外观上看,注释的 someParam
和方法 someParam
都声明为 String[]
数组。
我想这与 Java 在幕后处理注释的方式有关,and/or 事实上 someParam
被声明为一种方法(在括号处结束)在 SomeAnnotation
,但仍然...为什么?
如果有人能对此有所了解,我将不胜感激。
请注意,我不是在寻找替代方案或解决方法,而是在寻找一些解释。
后续问题
我知道我可以使用 new String[]...
语法调用该方法,如下所示:
Example.someMethod(new String[] { "foo", "bar" });
但这对我来说也很奇怪,因为参数应该是 String
的数组,而括号内的值确实是 String
s。我希望编译器能够匹配并接受它。
简单的解释就是,这是指定Java语言的方式。为新的编程语言设计语法是表达力和简洁性与简单性/可读性和无歧义之间的折衷。
基本的 Java 语法是他们在 ~1995 年得出的。从那时起,Java 设计师一直受到隐含要求的约束,即对语言语法的任何更改都不能“破坏”旧代码1.
注释实际上就是一个很好的例子。 @ <Identifier>
语法标记创建了一个新的上下文,其中新规则不会干扰 Java 语法的旧部分。这使他们能够在新上下文中使用更简单/更清晰的方式来编写“数组文字”。所以他们做到了。但是他们不能更普遍地做同样的事情 2 而不会产生解析问题 and/or 破坏旧的 Java 代码。
1 - 或者任何破损都应该是最小的。例如,将 enum
更改为 Java 5 中的关键字破坏了使用“枚举”作为标识符的现有 Java 代码的一小部分。这引起了一些焦虑。因此,当他们在 Java 10 中引入 var
时,他们将其设为“保留类型名称”而不是完整关键字。
2 - 至少,我认为他们不能。如果他们能做到,我想他们 会 在过去 25 年左右的时间里做到了。大多数人都认为 Java 数组初始化有点笨拙。