Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么只对注释数组参数使用方括号,而不对方法参数使用方括号?_Java_Arrays_Parameters_Java Annotations - Fatal编程技术网

Java 为什么只对注释数组参数使用方括号,而不对方法参数使用方括号?

Java 为什么只对注释数组参数使用方括号,而不对方法参数使用方括号?,java,arrays,parameters,java-annotations,Java,Arrays,Parameters,Java Annotations,好的,在Java语法中有一些我不太理解的东西让我有点困扰 当注释接受数组作为其参数值之一时,我们可以通过在两个括号内提供值来实现,如下所示: public@interface-SomeAnnotation{ 字符串[]someParam(); } @SomeAnnotation(someParam={“foo”,“bar”}) 公共类示例{} 这是传递值数组的一种非常简洁的方法。我喜欢 但调用方法时不能执行同样的操作: 公共接口示例{ 公共静态void someMethod(字符串[]som

好的,在Java语法中有一些我不太理解的东西让我有点困扰

当注释接受数组作为其参数值之一时,我们可以通过在两个括号内提供值来实现,如下所示:

public@interface-SomeAnnotation{
字符串[]someParam();
}
@SomeAnnotation(someParam={“foo”,“bar”})
公共类示例{}
这是传递值数组的一种非常简洁的方法。我喜欢

但调用方法时不能执行同样的操作:

公共接口示例{
公共静态void someMethod(字符串[]someParam){
//做点什么
}
}
// ...
示例.someMethod({“foo”,“bar});//语法错误:(
从外观上看,注释的
someParam
和方法
someParam
都声明为
String[]
数组

我想这与Java在幕后处理注释的方式有关,和/或
someParam
SomeAnnotation
中声明为一种方法(末尾带有括号)这一事实有关,但仍然…为什么

如果有人能解释一下,我将非常感激

请注意,我不是在寻找替代方案或解决方法,而是在寻找一些解释

后续问题

我知道我可以使用
新字符串[…]
语法调用该方法,如下所示:

Example.someMethod(新字符串[]{“foo”,“bar”});

但这对我来说似乎也很奇怪,因为param应该是一个字符串数组,括号内的值实际上是字符串。我希望编译器能够匹配这些内容,并对此表示满意。

简单的解释是,这就是Java语言的指定方式。Designin新编程语言的语法是表达性和简洁性与简单性/可读性和无歧义性之间的折衷

基本的Java语法是他们在1995年达成的。从那时起,Java设计人员一直受到隐式要求的约束,即对语言语法的任何更改都不得“破坏”旧代码1

注释实际上就是一个很好的例子。
@
语法标记创建了一个新的上下文,新规则不会干扰Java语法的旧部分。这允许他们使用更简单/更干净的方式编写“数组文本”在新的上下文中。他们确实这样做了。但是,如果不产生解析问题和/或破坏旧的Java代码,他们就不能做同样的事情


1-或者任何中断都应该是最小的。例如,在Java 5中将
enum
更改为关键字会中断使用“enum”作为标识符的现有Java代码的一小部分。这引起了一点担忧。因此,当他们在Java 10中引入
var
时,他们将其改为“保留类型名称”,而不是完整的关键字。

2-至少,我认为他们不能。如果他们能做到,我认为他们在过去25年左右就会做到。大多数人都认为Java数组初始化有点笨拙。

简单的解释是,这就是Java语言的指定方式。为新的编程语言设计语法是表达性和简洁性与简单性/可读性和无歧义性之间的折衷

基本的Java语法是他们在1995年达成的。从那时起,Java设计人员一直受到隐式要求的约束,即对语言语法的任何更改都不得“破坏”旧代码1

注释实际上就是一个很好的例子。
@
语法标记创建了一个新的上下文,新规则不会干扰Java语法的旧部分。这允许他们使用更简单/更干净的方式编写“数组文本”在新的上下文中。他们确实这样做了。但是,如果不产生解析问题和/或破坏旧的Java代码,他们就不能做同样的事情


1-或者任何中断都应该是最小的。例如,在Java 5中将
enum
更改为关键字会中断使用“enum”作为标识符的现有Java代码的一小部分。这引起了一点担忧。因此,当他们在Java 10中引入
var
时,他们将其改为“保留类型名称”,而不是完整的关键字。

2-至少,我认为他们做不到。如果他们能做到,我认为他们在过去25年左右就会做到。大多数人都认为Java数组初始化有点笨拙。

感谢这些解释。关于必须处理遗留语法与在新功能上自由简化语法的部分真的很令人信服ncing。谢谢你的解释。关于必须处理遗留语法与在新特性上自由简化语法的部分真的很有说服力。