模糊的varargs方法调用编译错误

时间:2014-04-09 12:25:52

标签: java variadic-functions

method(1);  // This works -

void method(int... x) { }
void method(int x) { }  // - this method is called

如果我在第二种方法中添加一个varargs参数,我会得到一个"对方法的引用是不明确的"编译错误:

method(1);  // This now fails

void method(int... x) { }
void method(int x, String... y) { }  // adding String... y causes a problem.

由于String ... y参数可以保留"空白",为什么Java仍然选择该方法?谢谢,如果对SO有一个非常匹配的解释,我们会道歉;我确实找了一个。

2 个答案:

答案 0 :(得分:4)

编译器总是选择使用 most 特定方法。

在第一种情况下,因为参数完全void method(int x)匹配,所以它就是被调用的那个。

在第二种情况下,参数的数量不匹配任何情况,并且可以从两种方法调用它们,从而导致歧义。

查看JLS - 15.12.2. Compile-Time Step 2: Determine Method Signature了解详情。

答案 1 :(得分:1)

参数的数量可以是0或许多。

void method(int x, String... y){ }void method(int x){}

类似

void method(int... x){}也类似于void method(int x){}

如果调用方法(1),编译器将找到两个适用于此调用的方法,并引发和异常。