【问题标题】:Difference argument passing to method and assignment [duplicate]传递给方法和赋值的差异参数[重复]
【发布时间】:2014-04-09 18:07:20
【问题描述】:
  List<Object[]> d = new ArrayList<Object[]>();

  d.add({"A"});//compile error
  Object [] arr = {"A"};//valid

我一直认为最后 2 行进行相同的操作并受类似规则的约束。

谁能解释一下?

【问题讨论】:

  • 你如何找到这些答案?
  • 嗯,我刚刚回答了一个:)。否则,如果您有编译器错误,请获取通用部分并搜索它们。如果这没有帮助,试着用语言表达什么是行不通的。例如,这里是array initialization
  • 只是为这些答案添加更多信息, d.add(new Object[]{"A"});可以正常工作

标签: java arrays argument-passing assignment-operator


【解决方案1】:

这不是将参数传递给方法。您只能在初始化数组时使用 {x} 速记,例如您的有效示例。其他任何地方都是无效的。如果需要在初始化后稍后实例化一个数组,则需要使用new int[]

int[] a = {1,2};    // OK

int[] b;
b = {1,2};          // compiler error

【讨论】:

    【解决方案2】:

    我一直认为最后 2 行进行相同的操作并受类似规则的约束。

    你错了。

    谁能解释一下?

    我无法解释你为什么错了,但我可以解释一下语法。最后一行是有效的,因为它是一个初始化,并且初始化具有特殊的语法。如果您将其拆分为声明和赋值,您将在赋值中遇到与第二行中相同的错误。 Java 中根本不存在该值的语法。

    【讨论】:

    • 如果你把它分成一个声明和一个赋值,你会在第二行的赋值中遇到同样的错误。- 有用的评论
    【解决方案3】:

    您不能使用数组初始值设定项作为参数。

    【讨论】:

    • 或者除了数组初始化器之外的任何其他东西。
    【解决方案4】:

    第一种情况

    d.add({"A"});//compile error
    

    您需要创建一个新的 Object[] 实例作为方法参数,如下所示:

    d.add(new Object[]{"A"});
    

    在第二种情况下,您创建一个 Object 数组。你也可以做类似的事情:

    Object [] arr = new Object[] {"A"};
    

    Java 允许您执行以下操作,因为我认为它与原始设计中的 C/C++ 数组定义保持了一些兼容性。

    Object [] arr = {"A"};//valid
    

    【讨论】:

    • 它可以让你这样做,因为从正在进行的声明中已经知道类型,所以再次指定它是多余的。但是,该类型在其他上下文中尚不为人所知,因此它是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多