次のコードはコンパイルされません。
package varargspkg;
public class Main {
public static void test(int... i) {
for (int t = 0; t < i.length; t++) {
System.out.println(i[t]);
}
System.out.println("int");
}
public static void test(float... f) {
for (int t = 0; t < f.length; t++) {
System.out.println(f[t]);
}
System.out.println("float");
}
public static void main(String[] args) {
test(1, 2); //Compilation error here quoted as follows.
}
}
コンパイル時エラーが発行されます。
testへの参照があいまいで、varargspkg.Mainのメソッドtest(int ...)とvarargspkg.Mainのメソッドtest(float ...)の両方が一致します
メソッド呼び出しのパラメータ値は、次のtest(1, 2);
ようにプロモートできるため、明らかなint
ようです。float
パラメータのいずれかまたは両方の末尾にF
またはが付いている場合f
は、コンパイルされます。
ただし、次のように、それぞれのラッパータイプを使用してメソッドシグネチャで受信パラメータを表す場合
public static void test(Integer... i) {
System.out.println("Integer" + Arrays.asList(i));
}
public static void test(Float... f) {
System.out.println("Float" + Arrays.asList(f));
}
その後、メソッドの呼び出しはtest(1, 2);
コンパイルエラーを発行しません。この場合に呼び出されるメソッドは、1つのInteger
varargsパラメーター(前のスニペットの最初のパラメーター)を受け入れるメソッドです。
この場合、最初のケースのようなエラーが報告されないのはなぜですか?ここでは、自動ボクシングと自動タイププロモーションの両方が適用されているようです。エラーが解決されるように、最初に自動ボクシングが適用されますか?
Oracleドキュメントによると、
一般的に言って、varargsメソッドをオーバーロードしないでください。そうしないと、プログラマーがどのオーバーロードが呼び出されるかを理解するのが難しくなります。
このリンクの最後の文。ただし、varargsをよりよく理解するためです。
また、以下に追加するコードは問題なくコンパイルされます。
public class OverLoading {
public static void main(String[] args) {
load(1);
}
public static void load(int i) {
System.out.println("int");
}
public static void load(float i) {
System.out.println("float");
}
}
編集:
以下は、コンパイルエラーを示すスナップショットです。新しいアプリケーションを作成したため、パッケージ名が異なります。
JDK6を使用しています。