可変長パラメータ


任意の数の引数を得る

Java では、C 言語の printf() 関数のような任意の数の引数を受けるメソッドを作ることができませんでした。 Java でこのような、任意の数の値をメソッドで受けるには、Object 型のような汎用性の高い型の配列から取得する必要がありました。

新しい Java では、可変長パラメータの導入によって C 言語の printf() 関数のようなメソッドを作ることが可能となりました。 コンパイルされたバイナリデータにとって、可変長パラメータの実体は配列にすぎないのですが、任意の数の値をメソッドに渡すさい、配列オブジェクトを作成する手間を省くことができます。

可変長パラメータをメソッドの引数に指定するには、次のように宣言します。 性質上、可変長パラメータは引数リストの最後にしか指定することができません。

型 ... 仮引数名

可変長パラメータは型と仮引数名の間に記号 ... があります。 これは、事実上次の宣言と同じであると考えることができます。

型 [ ] 仮引数名

可変長パラメータを持つメソッドを呼び出す場合、メソッド起動式で指定された可変個数引数は配列に変換されて仮パラメータに渡されます。 可変長パラメータに対して何も引数が渡されない場合も考えられ、この場合は長さ 0 の配列となります。

class Test {
	static void getArray(Object ... args) {
		for(Object obj : args) {
			System.out.println(obj);
		}
	}
	public static void main(String args[]) {
		getArray("Kitty" , "Cat" , 1 , 10 , Math.PI);
	}
}
>java Test
Kitty
Cat
1
10
3.141592653589793

このプログラムでは、Object 型の可変パラメータを受け取る getArray() メソッドを宣言しています。 このメソッドを main() メソッドから呼び出すときは、配列を渡すのではなく引数から直接、複数の Object 型のオブジェクトを渡すことができます。 数値を指定していますが、これらはボクシングによって Integer に変換されて渡されます。

javap コマンドを使って可変パラメータを持つメソッドを調べれば、コンパイル結果は配列に変換されていることが確認できるでしょう。 そのため、実は可変パラメータに対して配列を渡すことも可能です。

class Test {
	static void getArray(String ... args) {
		for(String obj : args) {
			System.out.println(obj);
		}
	}
	public static void main(String args[]) {
		String [] ary = new String[] { "Kitty" , "on", "your" , "lap" };
		getArray(ary);
	}
}

これは、可変パラメータに直接配列を渡した場合です。 このプログラムでは String 型の配列 ary を getArray() に渡していますが、これは getArray("Kitty" , "on", "your" , "lap") と記述した場合と同じです。

このような性質から、配列パラメータと可変パラメータは同一のものとして扱えるのかというと、必ずしもそうではありません。 実装は別として論理的に異なる要素であると捕らえるべきであり、オーバーライドなどで混在するのは避けなければなりません。



前のページへ戻る次のページへ