java - 为什么赋值时只能创建没有 `new`的数组?

标签 java arrays initialization specifications

T类型数组赋值期间,表达式的new T[]部分是隐式的。

int[] test = {1,2,3,5};

语言规范是否说明了为什么其他地方不支持这种类型的初始化?像下面这样的语法会与任何其他语言规则冲突吗?看起来类型推断不会太困难。

public static void test(int[] a, int[] b) { ... };
... 
test({1,2,3}, {4,5,6});

最佳答案

JLS 确实在第 15 节中规定您不能这样做。从 15.12 Method Invocation Expressions 开始我们可以看到调用方法的所有有效方式。其中重要的部分是可选的 ArgumentList这将给出有关参数有效语法的规范。

在调用表达式的下方,我们可以看到 ArgumentList 的定义,这主要是 Expression 的另一个链接.

当我们继续往下看时,我们可以看到 Expression 中定义了两种类型的表达式。 ; LambdaExpressionAssignmentExpression 。据我所知,您的问题是 "Class instance creation expressions"类型。事实证明,诸如 foo(new Bar[]{new Bar(), new Bar()}); 之类的调用是有效的。

当我们点击第 15.9 节的链接时,我们可以看到您的建议根本不被支持。

这并不能回答为什么;我确实意识到了这一点。然而,只有做出该决定的人才能回答原因。我们知道这种狡猾是可能的,正如其他语言所证明的那样。

关于java - 为什么赋值时只能创建没有 `new`的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35714263/

相关文章:

java - 使用 JSESSION ID 或身份验证访问 JSON

java - REST如何返回接口(interface)列表

php - json_encode 数组的特定部分

javascript - 返回过滤后数组的长度

arrays - 隐式 do 循环数组初始化

python - setattr 与 kwargs,pythonic 与否?

java - 如何保存文本文件而不必每次都输入文件名?

php - 用不同的字符串替换相同的字符

c++ - 这种初始化和赋值叫什么?

java - 使用 Fresco 库 android/java 将图像从手机加载到我的应用程序