【问题标题】:How does the compiler recognize which overloaded method to use? [duplicate]编译器如何识别使用哪个重载方法? [复制]
【发布时间】:2013-10-15 21:38:16
【问题描述】:

假设我有以下两个方法声明

public void foo() {/* do something */ }
public void foo(String...args) {/* do something else */}

那么当我调用foo() 时,Java 怎么知道我要调用第一个呢?据我了解,我可能指的是第二个。因为以下工作正常。

public void bar(String...args) {}
public void callBar()
{
    // call bar() with no arguments. 
     bar();
}

【问题讨论】:

  • rgettman 昨天对this 的回答很好地解释了事情。

标签: java overload-resolution


【解决方案1】:

根据JLS,带有可变参数的构造函数的优先级最低。如果可以在不使用 varargs 方法的情况下定义调用,它将使用那个。

第二阶段(第 15.12.2.3 节)在允许装箱和拆箱的同时执行重载解决方案,但仍排除使用变量 arity 方法调用。如果在此阶段没有找到适用的方法,则处理继续到第三阶段。

这确保了一个方法永远不会通过变量 arity 方法调用来选择,如果它适用于通过固定 arity 方法调用。

第三阶段(第 15.12.2.4 节)允许将重载与可变参数方法、装箱和拆箱相结合。

其中“可变数量”是指可变参数参数。更多信息可以在here找到。

【讨论】:

  • 啊,所以这只是一个约定/规则?
  • 是的,JLS 就是这样定义的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
相关资源
最近更新 更多