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 在后台处理注释的方式有关,和/或在 中someParam
声明为一种方法(末尾有括号)的事实SomeAnnotation
,但仍然......为什么?
如果有人可以对此有所了解,我将不胜感激。
请注意,我不是在寻找替代方案或解决方法,而是在寻找一些解释。
后续问题
我知道我可以使用new String[]...
语法调用该方法,如下所示:
Example.someMethod(new String[] { "foo", "bar" });
但这对我来说也很奇怪,因为参数应该是一个数组,String
括号内的值确实是String
s。我希望编译器能够匹配并接受它。
解决方案
简单的解释是这是指定 Java 语言的方式。为新的编程语言设计语法是在表达性和简洁性与简单性/可读性和明确性之间的折衷。
基本的 Java 语法是他们在 1995 年左右达到的。从那时起,Java 设计者一直受到隐含要求的约束,即对语言语法的任何更改都不得“破坏”旧代码1。
注释实际上就是一个很好的例子。语法标记创建一个新的@ <Identifier>
上下文,其中新规则不会干扰 Java 语法的旧部分。这使他们能够使用更简单/更简洁的方式在新上下文中编写“数组文字”。所以他们做到了。但是如果不产生解析问题和/或破坏旧的 Java 代码,他们就不能更普遍地做同样的事情2 。
1 - 或者任何破损都应该是最小的。例如,enum
在 Java 5 中更改为关键字会破坏一小部分使用“枚举”作为标识符的现有 Java 代码。这引起了一些不安。因此,当他们var
在 Java 10 中引入时,他们将其设为“保留类型名称”而不是完整的关键字。
2 - 至少,我认为他们不能。如果他们能做到,我认为他们会在过去 25 年左右做到这一点。大多数人都同意 Java 数组初始化有点笨拙。
推荐阅读
- r - How do I create a new variable for a group of observations based on another variable specific to that group
- postgresql - Can you call call perform/do functions from another function in PostgreSQL?
- javascript - 使用 findOneAndUpdate() 时投射到日期失败
- css - 如何使使用另一个变量定义的 CSS 变量反映对依赖项的更改?
- javascript - 如何在绑定顶点数组对象和缓冲区数据以在渲染时动态绘制时编写通用 webgl 渲染循环?
- c# - 如何以编程方式将 AssemblyInfo.cs 更新为预构建事件 (Visual Studio / msbuild)
- node.js - 我无法使用 sequelize 运行具有多个搜索参数的简单搜索
- javascript - html表单,如何通过传统post和jquery ajax同时向各个服务器发送数据
- azure - 无法在 Azure 门户中保存 JSON 配置文件更新
- javascript - How to autofocus on a specific input field in React (after clicking on another element)?