web-dev-qa-db-ja.com

可変長引数はJavaで配列として扱われますか?

私が理解しているように、arrayは固定数の要素で構成されており、variable length argumentは(同じ型の)渡したのと同じ数の引数を取ります。しかし、それらは同じですか?もう一方が期待される場所を通過できますか?

16
user3034861

はい、次のようなvarargsパラメータを持つメソッドがある場合:

public void foo(String... names)

そしてあなたはそれをこのように呼びます:

foo("x", "y", "z");

その後、コンパイラはそれを次のように変換します。

foo(new String[] { "x", "y", "z"});

namesパラメータのタイプはString[]、他の配列変数と同じように使用できます。 couldnullであることに注意してください:

String[] nullNames = null;
foo(nullNames);

詳細は varargsのドキュメント を参照してください。

これはではないということは、可変引数が配列と交換可能であることを意味します-可変引数を受け入れるためにメソッドを宣言する必要があります。たとえば、メソッドが次のように宣言されているとします。

public void foo(String[] names)

その後、それを呼び出す最初の方法はコンパイルされません。

24
Jon Skeet

それらは同じで、配列はvarargsメソッドの作成時にJVMによって内部的に使用されます。したがって、vararg引数を配列と同じように扱うことができるので、たとえばforループを拡張して使用します。

public void method(String... args) {
    for(String name : args) {
     //do something
     }
}

このように呼び出すか、配列を渡します

method("a", "b", "c"); 
method(new String[] {"a", "b", "c"});

詳細については、このニース 記事 を参照してください。

8
Petr Mensik

簡単なテストはそれらが同じであることを示唆します:

public class test {

    public static void varArgs(String... strings) {
        for (String s : strings) {
            System.out.println(s);
        }
    }

    public static void main(String[] args) {
        String[] strings = {"string1", "string2", "string3"};
        varArgs(strings);
        varArgs("string4", "string5", "string6");
    }
}

出力:

string1
string2
string3
string4
string5
string6
5
Sam G-H