私が理解しているように、array
は固定数の要素で構成されており、variable length argument
は(同じ型の)渡したのと同じ数の引数を取ります。しかし、それらは同じですか?もう一方が期待される場所を通過できますか?
はい、次のようなvarargsパラメータを持つメソッドがある場合:
public void foo(String... names)
そしてあなたはそれをこのように呼びます:
foo("x", "y", "z");
その後、コンパイラはそれを次のように変換します。
foo(new String[] { "x", "y", "z"});
names
パラメータのタイプはString[]
、他の配列変数と同じように使用できます。 couldがnull
であることに注意してください:
String[] nullNames = null;
foo(nullNames);
詳細は varargsのドキュメント を参照してください。
これはではないということは、可変引数が配列と交換可能であることを意味します-可変引数を受け入れるためにメソッドを宣言する必要があります。たとえば、メソッドが次のように宣言されているとします。
public void foo(String[] names)
その後、それを呼び出す最初の方法はコンパイルされません。
それらは同じで、配列は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"});
詳細については、このニース 記事 を参照してください。
簡単なテストはそれらが同じであることを示唆します:
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