1

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

它拒绝传入 aString但允许一维数组String []和二维数组String[][]。它不允许[][][]或其他任何事情。

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

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

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

谢谢。

4

3 回答 3

6

public static void m(String [] ... a)意味着您的函数可以接受任意数量的 String[] 作为参数,并且在函数内您将有一个 String[] 数组(即 String[][])作为a. 您也可以直接传递单个 String[][] 而不是传递多个 String[]。

例如...

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都会有一个名为 的二维字符串数组a

此外,由于ais a String[][],您也可以直接传入单个String[][]

String[][] XYZ = {x,y,z};

//Also valid. Same behaviour as m(x,y,z);
m(XYZ);
于 2013-01-05T20:27:59.570 回答
1

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

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

于 2013-01-05T20:35:33.383 回答
1

它只是编译器的一点语法糖。

那是:

ReturnType withVarArgs(ParamType... params) {}

主要相当于:

ReturnType noVarArgs(ParamType[] params) {}

有以下区别:

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