首页 > 解决方案 > 对可变参数方法的模糊调用

问题描述

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?
}

我已经阅读了本节中关于变量参数调用的第三条规则:选择最具体的方法,但我仍然感到困惑,因为对于调用 foo(1, 2),形式参数 long 和 Integer 都没有 int 特定,但它仍然会引发编译错误。

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

标签: javaoverloading

解决方案


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

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

如果您希望执行第二种方法,则需要将第一个参数转换为 long 值。像这样的东西:

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

推荐阅读