gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:58:17 26 4
gpt4 key购买 nike

假设我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com