1

私は可変引数の内外を理解しようとしていて、次のコードを書きました

public class VarArgTest {

/**
 * @param args
 */
public static void main(String[] args) {
    VarArgTest v = new VarArgTest();
    //Code 1
    System.out.println("haha");
}

public void m1(Integer a, Integer... ints) {
    System.out.println("1");
}

public void m1(Integer... ints) {
    System.out.println("2");
}
}

コード 1 を

v.m1(new Integer(1), new Integer(2));

次のメッセージが表示されます

The method m1(Integer, Integer[]) is ambiguous for the type VarArgTest

私の質問は、なぜクライアント コードでエラーをスローするのですか? 2 つの m1 メソッドを定義しているときに、コンパイラによってキャッチされるべきではありませんか?

4

2 に答える 2

4

これら 2 つのメソッドの明確な呼び出しがまだあるため、オーバーロードのエラーではありません。

v.m1(new Integer[] {1, 2})

v.m1(1, new Integer[] {2})

どちらも問題なく動作します。コンパイラが呼び出しの引数を配列に変換する方法を理解しなければならない場合にのみ、あいまいになります。

于 2013-04-12T05:16:24.087 に答える
0

つまり、これらの 2 つのメソッドは、呼び出すときに区別できません。

 v.m1(1,2,3,4) 

コンパイラは、どのメソッドを使用すべきかを知りません。

オーバーロードするときは、さまざまなパラメーター (メソッド シグネチャ) が必要です。

たとえば、これはコンパイラーには問題ありません:

   public void m1(String a, Integer... ints) {
    System.out.println("1");
   }

   public void m1(Integer... ints) {
    System.out.println("2");
   }
于 2013-04-12T05:15:14.643 に答える