【问题标题】:Java array initialization within argument list参数列表中的 Java 数组初始化
【发布时间】:2011-05-25 12:57:37
【问题描述】:

为什么第一次调用 someMethod 没有明确指出它是 String[] 就无法编译?

可以使用数组初始值设定项来创建 String[] 数组,但不能使用它来传递参数。花括号是否以其他方式用于传递参数,从而破坏了我期望它的行为方式?

public void someMethod(String[] arr){
    //do some magic
}

public void makeSomeMagic(){

    String[] arr = {"cat", "fish", "cow"};

    //Does not compile!
    someMethod({"cat", "fish", "cow"});

    //This compiles!
    someMethod(new String[]{"cat", "fish", "cow"});

    //This compiles!
    someMethod(arr);
}

编译错误如下:

Moo 类型中的 someMethod(String[]) 方法不适用于参数 (String, String, String)

【问题讨论】:

  • 仅在申报时允许。这是一个语法问题

标签: java arrays


【解决方案1】:

您只能在声明数组变量或在new String[] { ... } 等数组创建表达式中使用{ "hello", "world" } 初始化表示法。

请参阅 Java 语言规范中的 Section 10.6 Array Initializers

可以在声明中指定数组初始值设定项,或者作为数组创建表达式(第 15.10 节)的一部分,创建数组并提供一些初始值

【讨论】:

    【解决方案2】:

    如果您不想使用显式 String[],请使用:

    public void someMethod(String... arr){
        //do some magic
    }
    …
    someMethod("cm", "applicant", "lead");
    

    最后一个参数类型后面的三个句点表示最后一个参数可以作为数组或参数序列传递。

    Read more.

    【讨论】:

    • 这只有在他将签名更改为String... args时才有效。
    • 完美,这正是我想要的。谢谢!
    【解决方案3】:

    或者你可以使用可变参数:

    public void someMethod(String... arr){
        //do some magic
    }
    
    public void makeSomeMagic(){
        someMethod("cat", "fish", "cow");
    }
    

    它基本上是数组参数的一种奇特语法(vararg 必须是方法签名中的最后一个参数)。

    【讨论】:

      【解决方案4】:

      您可以使用花括号来初始化数组。在其他所有情况下,它都用于定义语句块。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-21
        • 2011-06-05
        • 2015-02-07
        • 1970-01-01
        • 2023-03-13
        • 2013-04-14
        • 2013-11-28
        • 1970-01-01
        相关资源
        最近更新 更多