19

如果您正在定义一个变量,那么如下声明/定义一个变量似乎是完全有效的:

    double[][] output = {{0,0},{1,0}};

但是,如果您要返回一个值,那么编写以下内容似乎是无效的:

    public double[] foo(){
      return {0,1,2}
    }

我会认为在内部,这两个都会执行相同的操作。至少,Eclipse 不同意。有谁知道区别是什么,在哪里可以看到,或者为什么接受前一个例子并拒绝后者是有益的?

编辑:好的,所以在初始化时它是合适的,但我没有看到任何歧义......JVM不能从变量的名称中解释变量的类型(在重新定义已经初始化的变量的情况下)或者返回时(JVM 可以只查看函数的返回类型)?是什么使初始化成为禁止隐式类型的规则的特例?是什么让一般规则需要显式类型?

4

3 回答 3

21

您只能在声明点使用大括号表示法,编译器可以从声明类型推断数组的类型。

要在其他任何地方使用它,您需要使用Array Creation Expression

return new double[] {0,1,2};
于 2013-07-29T20:46:59.607 回答
15

只有在声明期间才可以接受。但是,您可以使用new double[] {0, 1, 2}.

JLS §10.6

数组初始值设定项可以在声明中指定,也可以作为数组创建表达式的一部分。

数组创建表达式是new double[] { }语法。

于 2013-07-29T20:47:02.603 回答
-1

我发现的另一种极端情况是创建二维数组并初始化二维数组中的数组

所以从 Jeffrey 的回复中 - https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.6 - “数组初始化器可以在声明中指定,或者作为一个数组创建表达式”,下面的代码应该可以工作,因为数组初始化器被用来初始化数组

int[][] grid = new int[3][3];
grid[0] =  {1,1,1};

但是这不起作用(编译错误),我不得不将其重写为

grid[0] =  new int[]{1,1,1};
于 2019-10-13T07:41:26.490 回答