java - 重载解析,调用哪个方法

标签 java overloading method-signature

假设我有一个 ComponentBase类(class),谁是ObjectContextDecorator的 child 和 ObjectContext 的孙子.

public class ComponentBase extends ObjectContextDecorator {
}

public class ObjectContextDecorator extends ObjectContext {

    public void set(String objectTypePath, String characteristicName, Object value) {
        //...
    }
}

public class ObjectContext {
    public void set(String characteristicName, Object value, boolean forced) {
       //...
    }
}
set ObjectContextDecorator 上的方法和 ObjectContext非常相似。考虑这个示例代码:
ComponentBase base = new ComponentBase();
base.set(""OTM4E_EFFLEVEL"", ""IE1 / STD"", true);

两种方法的签名都适合正确调用的方法。我无法更改方法的签名,因为它不是我的代码。

编译器如何知道我打算调用哪个方法?

我知道在 IDE 上您可以指出您实际打算调用哪个方法,但在这种情况下,我使用类加载器来加载一个类,该类具有包含示例代码的方法。

最佳答案

这一切都在 JLS §15.2 中进行了解释方法调用表达式。它告诉您如何选择正确的调用方法。请注意,这并不总是成功。
在您的特定情况下,这两种方法是彼此的重载,因此第 15.2.2 节“编译时步骤 2:确定方法签名”适用 - 要调用的重载在编译时确定。此步骤进一步分为 3 个阶段。

The first phase (§15.12.2.2) performs overload resolution without permitting boxing or unboxing conversion, or the use of variable arity method invocation. If no applicable method is found during this phase then processing continues to the second phase.


在第一阶段,编译器尝试在不允许装箱转换的情况下找到适用的方法。在您的情况下,调用需要 Object 的重载,需要进行装箱转换才能转换 boolean true到类型 Object ,这样就不会在第一阶段选择过载。

If no method applicable by strict invocation is found, the search for applicable methods continues with phase 2 (§15.12.2.3).

Otherwise, the most specific method (§15.12.2.5) is chosen among the methods that are applicable by strict invocation.


好吧,我们已经找到了一种方法,因此我们将选择该方法。没有歧义。

关于java - 重载解析,调用哪个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59862051/

相关文章:

用于 CSV 文件处理的 Java 数据类型

java - 使用第三方jar在命令行中执行jar文件

c++ - 在以下 C++ 代码中,运算符重载决策如何基于返回类型工作

Asp.Net MVC - 重载操作方法

python-3.x - 在哪里可以找到 PyQt5 方法签名?

java - 在没有固有 WithDayOfMonth 方法的情况下使用 DateTime 将日期设置为每月第一天的最佳方法

java - OffsetDateTime 到毫秒

Java-jxls-XLSTransformer线程安全

c# - 内插字符串的原始类型是什么?

Java 集合。添加(E obj),但删除(Object obj)