gpt4 book ai didi

java - 为什么 Java 禁止将数组初始值设定项作为方法调用参数?

转载 作者:行者123 更新时间:2023-11-29 08:24:20 25 4
gpt4 key购买 nike

<分区>

在Java中我们可以定义一个数组变量并像这样初始化它:

int[] prime10 = new int[] { 2, 3, 5, 7 };

在JLS中,赋值的右边叫做ArrayCreationExpression . JLS 语法术语中的初始值设定项是 ArrayInitializer .

与所有表达式一样,ArrayCreationExpression 可用于方法调用参数列表中:

callMe(new int[] { 2, 3, 5, 7 });

但是,我们也可以使用更短的形式 VariableInitializer ,仅使用 ArrayInitializer:

int[] prime10 = { 2, 3, 5, 7 };

但我们不能在 method call 中使用相同的初始化程序

// ILLEGAL IN JAVA
callMe({ 2, 3, 5, 7 });

当然可以理解为什么编译失败,分析语法时——摘自JLS:

VariableDeclarator:
VariableDeclaratorId [= VariableInitializer]

VariableInitializer:
Expression
ArrayInitializer

MethodInvocation:
MethodName ( [ArgumentList] )
// plus other variants...

ArgumentList:
Expression {, Expression}

但为什么会做出这样的决定呢?为什么不使 ArrayInitializer 成为 Expression,或者至少将带有 ArrayInitializer 的变体添加到 ArgumentList?它是明显的语法,还是有其他原因(可能是类型推断)禁止这样的扩展?

更新

在本着“你怎么知道 {1, 2, 3}” 的精神进行一些评论之后,进行技术澄清。

在方法调用中,方法形式参数决定了允许的参数类型。所以如果我有一个方法声明:

void callMe(Number[] numbers) {
//...
}

然后是被质疑的电话

callMe({ 1, 2, 3 }); // still ILLEGAL in Java

意味着

callMe(new Number[] { 1, 2, 3 });

所以这里没问题。我的问题不是针对固执己见的“谁需要这个”——不管怎样,谁需要 lambda、菱形和 var ;)——而是,从 JLS 的角度来看,是什么(正式地)禁止了这样的构造,或者至少从“Java 架构师”的角度将这些特性引入语言?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com