重载解析,调用哪个方法

Gab*_*ina 8 java overloading method-signature

假设我有一个ComponentBase班级,谁是 的孩子ObjectContextDecorator和孙子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) {
       //...
    }
}
Run Code Online (Sandbox Code Playgroud)

和上的set方法非常相似。考虑这个示例代码:ObjectContextDecoratorObjectContext

ComponentBase base = new ComponentBase();
base.set(""OTM4E_EFFLEVEL"", ""IE1 / STD"", true);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Osc*_*Ryz 2

\n

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

\n
\n\n

它检查参数并根据JLS \xc2\xa715.2描述的规则确定哪一个更具体

\n\n

在你的情况下,调用:

\n\n
base.set("OTM4E_EFFLEVEL", "IE1 / STD", true)\n
Run Code Online (Sandbox Code Playgroud)\n\n

参数是String, String,boolean

\n\n

它与第一个类匹配(为简洁起见,更改了参数名称

\n\n
public class ObjectContext {\n    public void set(String s, Object o, boolean b){\n       //...\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

调用第二个类,因为第三个参数是Object

\n\n
public class ObjectContextDecorator extends ObjectContext {\n\n    public void set(String s, String ss, Object thisOneRightHere) {\n        //...\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然布尔值true可以匹配(如果自动装箱),但第一个值更具体。这里应用的规则是:

\n\n
\n

第一阶段 (\xc2\xa715.12.2.2) 执行重载解析,不允许装箱或拆箱转换

\n
\n\n

但是,例如,如果您Boolean在签名中使用对象包装器:

\n\n
public class ObjectContext {\n    public void set(String s, Object o, Boolean b){ //<-- third param changed from boolean to Boolean\n       //...\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后它们都会匹配,编译器会通过以下消息通知您:

\n\n
> A.java:25: error: reference to set is ambiguous\n>     base.set("OTM4E_EFFLEVEL", "IE1 / STD", true);\n>         ^   both method set(String,Object,Boolean) in ObjectContext and method set(String,String,Object) in ObjectContextDecorator match\n
Run Code Online (Sandbox Code Playgroud)\n\n

但您的示例并非如此。

\n