在Java中,{a,b,c,…}数组缩写什么时候不合适,为什么?

在Java中,{a,b,c,…}数组缩写什么时候不合适,为什么?,java,arrays,notation,Java,Arrays,Notation,如果您正在定义一个变量,那么按照以下方式声明/定义一个变量似乎是完全有效的: double[][] output = {{0,0},{1,0}}; 但如果返回值,则写入以下内容似乎无效: public double[] foo(){ return {0,1,2} } 我本以为,在内部,这两个机构会执行相同的操作。至少Eclipse不这么认为。有没有人知道区别是什么,还有哪里可以看到,或者为什么接受前者而拒绝后者是有益的 编辑:好的,所以在初始化时它是合适的

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

    double[][] output = {{0,0},{1,0}};
但如果返回值,则写入以下内容似乎无效:

    public double[] foo(){
      return {0,1,2}
    }
我本以为,在内部,这两个机构会执行相同的操作。至少Eclipse不这么认为。有没有人知道区别是什么,还有哪里可以看到,或者为什么接受前者而拒绝后者是有益的


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

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


要在任何其他需要使用的地方使用它,请使用:


只有在申报时才可以接受。但是,您可以使用
newdouble[]{0,1,2}

JLS:

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


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

我发现的另一个边缘情况是创建二维数组并初始化二维数组中的数组

因此,从Jeffrey的回答——“可以在声明中指定数组初始值设定项,或者将其作为数组创建表达式的一部分”,下面的代码应该可以正常工作,因为数组初始值设定项用于初始化数组

int[][] grid = new int[3][3];
grid[0] =  {1,1,1};
然而,这不起作用(编译错误),我不得不将其重写为

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

“只有在申报时才可以接受。”为什么?为什么不在return语句中执行?@JohnP,因为语言不允许它。据我所知,没有什么好的理由反对它(我想编译器可能需要做更多的类型推断来确保创建是安全的)。@Jeffrey我明白John的观点。行为应该是consistent@Jeffrey-是否有其他方法创建类似数组的数组。创建(1,2,3)?“要在其他任何地方使用它,您需要使用数组创建表达式”。为什么?为什么返回语句不能使用相同的符号?@JohnP。因为Java语言创建者就是这样设计的。看,不,我不这么认为。如果我问为什么鸟类会长羽毛而不是毛皮,说“因为造物主是这样做的”是远远不能令人满意的,对吧?我更愿意接受杰弗里的回答,因为你只是在乞求。我在寻找语言设计背后的原因。见第1.2.1节最后一段。C++允许您返回括号初始化器,因为该类型已经由签名指定;Java不仅应该能够做到这一点,而且应该受到我链接中的推理(除非技术原因阻止它,等等)的激励。对于“乞讨”,我的反应很糟糕,“接受我的答案”而不是“答案”。我想为此道歉,迟到了两年,诸如此类。@JohnP对于这种行为,如何向Java平台提交更改?我不改变语法规则,因为这会破坏很多代码,但是它被改变成接受语法,我认为它应该与C++相一致,正如你提到的,你提出了一个好的观点。当涉及到这个行为时,我对查看JVM的源代码非常感兴趣。在JLS中也有这样的要求。如果你想知道原因,你必须问其中一个。
grid[0] =  new int[]{1,1,1};