6

据我所知,这段代码:

int[] numbers = new int[] { 1, 2 };

与此代码相同:

int[] numbers = { 1, 2 };

事实上,编译后的.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

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

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

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

for (int i : { 1, 2 }) {
    System.out.print(i + " ");
}

生成多个编译时错误,以

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

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

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

4

1 回答 1

2

JLS #10.6. Array Initializers

数组初始值设定项可以在声明中指定(第 8.3 节、第 9.3 节、第 14.4 节),或者作为数组创建表达式的一部分(第 15.10 节)来创建数组并提供一些初始值。

于 2013-05-28T05:26:47.203 回答