2013-05-28 51 views
6

据我所知,这代码:我应该在内联初始化数组中使用`new`吗?

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 + " "); 
} 

此代码(在主要方法中)编译和打印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类型的表达式的类型?

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

+0

@LuiggiMendoza感谢您的有用的链接。但是,我不确定它是否完全回答了这个问题:即是否存在其他语法不同的情况? – wchargin

+0

检查所有答案,而不仅仅是最上面的答案。 –

+2

我假设你指的是erickson的[this one](http://stackoverflow.com/a/16697404/732016)。这个答案确实解释了它的方法,但不适用于'for'循环,其中类型明确说明并且没有循环风险。 – wchargin

回答

2

JLS #10.6. Array Initializers

数组初始化可在声明中指定(§8.3,第9.3节,§14.4),或作为阵列创建表达式(§15.10)的一部分,以创建一个数组并提供一些初始值。

相关问题