我应该在内联初始化数组中使用`new`吗?

wch*_*gin 6 java arrays

据我所知,这段代码:

int[] numbers = new int[] { 1, 2 };
Run Code Online (Sandbox Code Playgroud)

与此代码相同:

int[] numbers = { 1, 2 };
Run Code Online (Sandbox Code Playgroud)

实际上,编译后的.class反汇编代码相同:

 1: newarray       int
 3: dup
 4: iconst_0
 5: iconst_1
 6: iastore
 7: dup
 8: iconst_1
 9: iconst_2
10: iastore
11: astore_1
12: iconst_2
Run Code Online (Sandbox Code Playgroud)

但是,类似的代码并不总是以相同的方式执行,甚至不能编译.例如,考虑:

for (int i : new int[] { 1, 2 }) {
    System.out.print(i + " ");
}
Run Code Online (Sandbox Code Playgroud)

此代码(在主方法中)编译和打印1 2.但是,删除new int[]以进行以下操作:

for (int i : { 1, 2 }) {
    System.out.print(i + " ");
}
Run Code Online (Sandbox Code Playgroud)

生成多个编译时错误,从

Test.java:3: error: illegal start of expression
for (int i : {1, 2} ) {
             ^
Run Code Online (Sandbox Code Playgroud)

我假设这两个例子之间的区别在于,在第一个例子(with int[] numbers)中,int明确说明了类型.但是,如果是这种情况,为什么Java不能从类型中推断出表达式的类型i

更重要的是,是否存在两种语法不同的其他情况,或者哪种情况比另一种更好?

Ami*_*nde 2

JLS #10.6. Array Initializers

\n\n
\n

数组初始值设定项可以在声明中指定(\xc2\xa78.3、\xc2\xa79.3、\xc2\xa714.4),或作为数组创建表达式的一部分(\xc2\xa715.10),以创建一个数组并提供一些初始值。

\n
\n