在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 中定义了两种类型的表达式。 ; LambdaExpression和 AssignmentExpression 。据我所知,您的问题是 "Class instance creation expressions"类型。事实证明,诸如 foo(new Bar[]{new Bar(), new Bar()});
之类的调用是有效的。
当我们点击第 15.9 节的链接时,我们可以看到您的建议根本不被支持。
这并不能回答为什么;我确实意识到了这一点。然而,只有做出该决定的人才能回答原因。我们知道这种狡猾是可能的,正如其他语言所证明的那样。
关于java - 为什么赋值时只能创建没有 `new`的数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35714263/