1

これは何を意味するのでしょうか?m最初のメソッドパラメータ宣言の意味がわかりません。

a を渡すことを拒否しStringますが、1 次元配列String []と 2次元配列は許可します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という名前の文字列の 2 次元配列がありaます。

さらに、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 の可変数の引数を指定する方法は 2 つあります。T に変換可能な代入式を直接リストするか、単一の T[] を指定できます。

特定のケースでは、String[] 型の式をリストするか、単一の String[][] を指定できることを意味します。

于 2013-01-05T20:35:33.383 に答える
1

これは、コンパイラからの構文シュガーのほんの一部です。

あれは:

ReturnType withVarArgs(ParamType... params) {}

以下とほぼ同等です。

ReturnType noVarArgs(ParamType[] params) {}

次の違いがあります。

  • タイプ の変数a,bがある場合、構文;で関数を呼び出すことができます。バリアントを呼び出すには、中間配列を自分で作成する必要があります。cParamTypewithVarArgswithVarArgs(a, b, c)noVarArgs
  • 可変引数パラメーターは、最後のパラメーターとしてのみ指定できます。
  • 効果的な Java で指摘されているように、 のサブタイプの配列を渡すObject...と、 との動作が異なります(たとえば、 を渡したいとしましょう)。 Object[]ObjectString[]
    • とともに使用するとObject...String[]配列オブジェクトは 1 要素のオブジェクト配列にラップされます。
    • とともに使用するとObject[]String[]配列オブジェクトが直接使用されます。これは、Java の配列は要素の型で共変であるためです。
于 2013-01-05T20:39:09.693 に答える