【发布时间】:2013-05-22 23:03:43
【问题描述】:
据我所知,这段代码:
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的类型推断出表达式的类型呢?
更重要的是,是否存在两种语法不同的其他情况,或者使用一种比另一种更好的情况?
【问题讨论】:
-
@LuiggiMendoza 感谢您提供有用的链接。但是,我不确定它是否完全回答了这个问题:即是否存在语法不同的其他情况?
-
检查所有答案,而不仅仅是最上面的答案。
-
我假设您指的是埃里克森的this one。该答案确实解释了方法,但不适用于
for循环,其中明确说明了类型并且没有循环风险。 -
如上所述,编译器无法推断数组的类型,因此您需要一个匿名数组,即使用
new int[]{ <elements> }。 -
编译器怎么无法推断类型?变量
i的声明类型呢?它是int- 因此下面的必须是int[]或Iterable<Integer>,它显然不能是第二个。我没有看到歧义。