【问题标题】:Ambiguous call to varargs methods对可变参数方法的模糊调用
【发布时间】:2018-08-01 10:04:18
【问题描述】:
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,但它仍然会引发编译错误。

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

【问题讨论】:

  • 您使用的是哪个 Java 版本?使用 Java 8 对我来说效果很好
  • 您使用的是哪个 IDE?
  • 我自己是个菜鸟,但我的印象是 varargs 需要装箱,因为它们最终会出现在列表中。所以也许 int to long vs boxing an int 不能正确比较哪个是更好的匹配?
  • 另外,1 是一个int1L 将是 long
  • @alexander.egger 我使用 jdk1.8.0_172 和 eclipse photon

标签: java overloading


【解决方案1】:

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

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

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

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

【讨论】:

  • 我也使用 jdk1.8.0_172 但我仍然收到此编译错误。这也太奇怪了……
猜你喜欢
  • 1970-01-01
  • 2018-03-20
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
相关资源
最近更新 更多