对varargs方法的模棱两可的调用

时间:2018-08-01 10:04:19

标签: java overloading

public static void foo(int... a){}

public static void foo(long b, Integer... a){}

public static void main(String[] args) {
    foo(1, 2); //Why is this call ambiguous?
}

在本节中,我已经阅读了关于可变Arity调用的第三条规则:Choosing the Most Specific Method,但我仍然感到困惑,因为对于调用foo(1,2)来说,long的形式参数和Integer都较少比int更具体,但仍然会引发编译错误。

我在eclipse和命令提示符下尝试使用jdk1.8和jdk10时,得到的结果都是相同的:错误:对'foo'的引用不明确。

1 个答案:

答案 0 :(得分:1)

这取决于您使用的JDK版本。

我已经在JDK 8上运行了您的代码,并且运行良好,它执行了第一种方法。这是因为,在JDK 8上,编译器将数字1和2强制转换为整数。

如果要执行第二个方法,则需要将第一个参数转换为long值。像这样:

public static void main(final String[] args) {
    foo(1l, 2);
}