在Java中,{a,b,c,...}数组的简写何时不合适,为什么?

Joh*_*n P 10 java arrays notation

如果您正在定义变量,则声明/定义变量似乎完全有效,如下所示:

    double[][] output = {{0,0},{1,0}};
Run Code Online (Sandbox Code Playgroud)

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

    public double[] foo(){
      return {0,1,2}
    }
Run Code Online (Sandbox Code Playgroud)

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

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

Roh*_*ain 15

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

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

return new double[] {0,1,2};
Run Code Online (Sandbox Code Playgroud)

  • 我一直在寻找语言设计背后的原因。请参阅http://www.oracle.com/technetwork/java/intro-141325.html第1.2.1节,最后一段。C ++允许您返回括号初始化程序,因为签名已经指定了类型。Java不仅应该能够做到这一点,而且应该受到我链接中推理的推动(除非出于技术原因阻止了它,等等)。至于“乞讨”,我的反应很差,“接受*我*回答”而不是“ *一个*答案”。我要为此道歉,迟到了两年。 (2认同)

Jef*_*rey 9

它只能在声明中接受.但是,您可以使用new double[] {0, 1, 2}.

JLS 10.6节:

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

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

  • “这仅在声明期间可以接受。” 为什么?为什么不在退货声明中? (2认同)
  • @JohnP,因为语言不允许。据我所知,没有很好的对策(我猜编译器可能需要做更多的类型推断,以确保创建是安全的)。 (2认同)
  • @Jeffrey我明白了约翰的观点。行为应保持一致 (2认同)