混淆“array var-args”作为参数

时间:2013-01-05 20:25:44

标签: java

这是什么意思?我不知道第一个方法m参数声明是什么意思。

它拒绝传入String,但允许使用一维数组String []和二维数组String[][]。它不允许[][][]或其他任何内容。

有人可以解决这个问题吗?

class j{
    public static void m(String [] ...  a) {
        System.out.println("Y");
    }

    public static void main(String[] args) {
        String [][] s = {};
        m(s);
    }
}

感谢。

3 个答案:

答案 0 :(得分:6)

public static void m(String [] ... a)表示你的函数可以接受任意数量的String []作为参数,并且在函数中你将拥有一个String []数组(即String [] [])作为{{的类型1}}。您也可以直接传递单个String [] [],而不是传递多个String []。

例如......

a

在每种情况下,String [] x = {"a", "aa", "aaa"}; String [] y = {"b", "bb", "bbb"}; String [] z = {"c", "cc", "ccc"}; //All of these are valid uses of m(...). m(x); m(x,y); m(x,y,z); 都会有一个名为m的二维字符串数组。

此外,由于aa,您也可以直接传递一个String[][]

String[][]

答案 1 :(得分:1)

有两种方法可以提供类型为T的可变数量的参数。您可以直接列出可转换为T的赋值表达式,也可以提供单个T []。

对于特定情况,这意味着您可以列出String []类型的表达式,或者提供单个String [] []。

答案 2 :(得分:1)

这只是编译器的一些语法糖。

那是:

ReturnType withVarArgs(ParamType... params) {}

大致相当于:

ReturnType noVarArgs(ParamType[] params) {}

有以下不同之处:

  • 如果您拥有a类型的变量bcParamType,则可以使用语法withVarArgs调用withVarArgs(a, b, c)函数;你必须自己创建一个中间数组来调用noVarArgs变体。
  • 变量arguments参数只能指定为最后一个参数;
  • 正如Effective Java中所指出的,当您传递Object...子类型的任何数组时,Object[]Object的行为会有所不同(例如,假设您想通过一个String[]):
    • 如果它与Object...一起使用,String[]数组对象将被包装在1个元素的对象数组中;
    • 如果它与Object[]一起使用,String[]数组对象将被直接使用,因为Java中的数组在其元素类型上是协变的;