【问题标题】:Should I use `new` with an inline-initialized array? [duplicate]我应该将`new`与内联初始化的数组一起使用吗? [复制]
【发布时间】: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>,它显然不能是第二个。我没有看到歧义。

标签: java arrays


【解决方案1】:

来自JLS #10.6. Array Initializers

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

【讨论】:

    猜你喜欢
    • 2014-02-06
    • 2015-02-12
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 2021-07-08
    • 2013-08-17
    相关资源
    最近更新 更多