据我所知,这段代码:
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?
更重要的是,是否存在两种语法不同的其他情况,或者哪种情况比另一种更好?
从JLS #10.6. Array Initializers
\n\n数组初始值设定项可以在声明中指定(\xc2\xa78.3、\xc2\xa79.3、\xc2\xa714.4),或作为数组创建表达式的一部分(\xc2\xa715.10),以创建一个数组并提供一些初始值。
\n
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |