【问题标题】:In Java, when is the {a,b,c,...} array shorthand inappropriate, and why?在 Java 中,什么时候 {a,b,c,...} 数组简写不合适,为什么?
【发布时间】:2013-07-29 19:45:14
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 你提出了一个很好的观点。当涉及到这种行为时,我对查看 JVM 的源代码非常感兴趣。
  • 正如其他人所说,Java 创建者就是这样设计的。在 JLS 中也有这样的要求。如果您想知道其中的原因,您必须询问其中一位。

标签: java arrays notation


【解决方案1】:

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

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

return new double[] {0,1,2};

【讨论】:

  • “要在其他任何地方使用它,您需要使用数组创建表达式”。为什么?为什么 return 语句不能使用相同的符号?
  • @JohnP。因为,Java Language Creator 就是这样设计的。见JLS Section 10.6
  • 不,我不这么认为。如果我问为什么鸟类会长出羽毛而不是毛皮,说“因为造物主是那样做的”就远远不能令人满意,对吧?我更有可能接受 Jeffrey 的回答,纯粹是因为你乞求。
  • 我一直在寻找语言设计背后的原因。请参阅oracle.com/technetwork/java/intro-141325.html 第 1.2.1 节最后一段。 C++ 允许您返回一个大括号初始值设定项,因为类型已由签名指定; Java 不仅应该能够做到这一点,而且应该受到我链接中的推理的激励(除非技术原因阻止它等)。至于“乞求”,我的反应很差,“接受 my answer' 而不是 'an answer'。我想为此道歉,晚了两年。
  • @JohnP 如何针对这种行为向 Java 平台提交更改?我没有更改语法规则,因为这会破坏很多代码,但它被更改为接受两种语法,我认为它应该与你提到的 C++ 保持一致
【解决方案2】:

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

JLS§10.6:

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

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

【讨论】:

  • "只有在申报时才可以接受。"为什么?为什么不在退货声明期间?
  • @JohnP 因为语言不允许。据我所知,没有好的理由反对它(我猜编译器可能需要做更多的类型推断来确保创建是安全的)。
  • @Jeffrey 我明白约翰的意思。行为应该是一致的
  • @Jeffrey - 是否有另一种方法来创建像 Arrays.create(1,2,3) 这样的数组?
【解决方案3】:

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

因此,根据 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};

【讨论】:

    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多