web-dev-qa-db-ja.com

Javaメソッドシグネチャの「params」?

C#では、メソッドに不定の数のパラメーターを持たせたい場合、メソッドシグネチャの最後のパラメーターをparamsにすると、メソッドパラメーターは配列のように見えますが、メソッドを使用するすべてのユーザーがそのタイプのパラメーターは、呼び出し側が望む数だけ。

Javaは同様の動作をサポートしていますが、その方法を見つけることはできません。

106
Omar Kooheji

Javaこれは varargs と呼ばれ、構文は通常のパラメーターのように見えますが、型の後に省略記号( "...")があります。

public void foo(Object... bar) {
    for (Object baz : bar) {
        System.out.println(baz.toString());
    }
}

Varargパラメーターは、alwaysである必要があり、メソッドシグネチャのlastパラメーターであり、そのタイプの配列を受け取りました(例:Object[] この場合)。

187
David Grant

これはJavaでトリックを行います

public void foo(String parameter, Object... arguments);

3つのポイントを追加する必要があります...およびvaragrパラメーターは、メソッドの署名の最後でなければなりません。

11
Stefano Driussi

以前の回答に書かれているように、それはvarargsであり、Ellipsisで宣言されています(...

さらに、値のタイプまたは参照タイプ、あるいはその両方を混合して渡すことができます(google Autoboxing)。さらに、下のprintArgsAlternateメソッドで示されているように、methodパラメーターを配列として使用できます。

デモコード

public class VarargsDemo {

    public static void main(String[] args) {
        printArgs(3, true, "Hello!", new Boolean(true), new Double(25.3), 'a', new Character('X'));
        printArgsAlternate(3, true, "Hello!", new Boolean(true), new Double(25.3), 'a', new Character('X'));
    }

    private static void printArgs(Object... arguments) {
        System.out.print("Arguments: ");
        for(Object o : arguments)
            System.out.print(o + " ");

        System.out.println();
    }

    private static void printArgsAlternate(Object... arguments) {
        System.out.print("Arguments: ");

        for(int i = 0; i < arguments.length; i++)
            System.out.print(arguments[i] + " ");

        System.out.println();
    }

}

出力

Arguments: 3 true Hello! true 25.3 a X 
Arguments: 3 true Hello! true 25.3 a X 
3