scjpにおける可変パラメータリストに関する疑問

2700 ワード

まず、次の2つのコードを見てください.

public class Overload {
	public void method(String[] names) {
		for (String string : names) {
			System.out.println(string);
		}
	}

	public void method(String... names) {
		for (String string : names) {
			System.out.println(string);
		}
	}

}

public class Overload {
	public void method(String[] names) {
		for (String string : names) {
			System.out.println(string);
		}
	}

	public void method(String name,String... names) {
		for (String string : names) {
			System.out.println(string);
		}
	}
}

なぜ1段目のコードはコンパイル時にエラーを報告し、2段目のコードはエラーを報告しないのかと聞かれることがあります.
まずjava 5に追加されたプロパティ「可変パラメータリスト」を簡単に理解する必要があります.
(Object...obj)のような形で配列型パラメータを宣言する方法は可変パラメータリストであり、このような利点は2つある.
1.この方法を使用すると、任意の(任意のパラメータを入力しなくてもよい)複数のObjectタイプのパラメータを入力できます.
2.メソッドを呼び出す前に配列を作成してから、パラメータをメソッドに渡す必要はありません.可変パラメータリストは、これらのパラメータを自動的に配列にカプセル化します.
ここで注意すべき点はいくつかあります.
1.可変パラメータリストは本質的に配列である
2.Objectは任意のタイプで置き換えることができる
3.1つの方法では可変パラメータのリストが1つしかなく、すべてのパラメータの最後の位置にしか配置できません.
では、可変パラメータリストという新しい言語特性を基本的に理解しました.次に、文章の最初の2つのコードに戻ります.1つ目のコードにはmethod(String[]names)とmethod(String...names)の2つの方法があります.先ほどお話しした可変パラメータリストによると、本質的に配列、つまりString[]namesとString...namesの2つのパラメータ宣言方式はまったく同じであるため,この2つのメソッド署名はまったく同じであり,メソッドリロード(Overload)を実現することができず,コンパイル時のエラー(Compile Error)が発生する.
2段目のコードは、2つのメソッドmethod(String[]names)とmethod(String name,String...names)があり、パラメータの数が異なるため、メソッドリロード(Overload)を実現でき、エラーは発生しません.
最後に、可変パラメータリストを含むメソッドを正しく使用する方法について説明するコードを使用します.

public class Overload {
	public void method(String... names) {
		for (String string : names) {
			System.out.println(string);
		}
	}
	
	public static void main(String[] args) {
		Overload ol = new Overload();
		String[] strings = {new String("a"),"b"};
		ol.method(strings); // 
		ol.method("a","b"); // 
		ol.method();		// 
	}
}/* Output:
a
b
a
b
*/

補足:
可変パラメータのリストが配列であることをよりよく理解するには、次のコードを参照してください.

public class VariantList {

	public static void main(String... args) {
		System.out.println("main String... args");
	}

}/* Output:
main String... args
*/

ここでのpublic static void main(String...args)はpublic static void main(String[]args)と全く同じです
声明:JavaEye記事の著作権は作者に属し、法律によって保護されています.作者の書面による許可がなければ転載してはならない.