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

我的问题是,为什么在客户端代码中抛出错误?在定义两个 m1 方法时不应该被编译器捕获吗?

4

2 回答 2

4

这不是重载中的错误,因为这两种方法仍然存在明确的调用。

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

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

两者都可以正常工作。只有当编译器必须弄清楚如何将调用中的参数转换为数组时,它才会变得模棱两可。

于 2013-04-12T05:16:24.087 回答
0

这意味着当您调用时无法区分这两种方法

 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 回答