据我所知,这段代码:
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
?
更重要的是,是否存在两种语法不同的其他情况,或者使用一种比另一种更好的情况?