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 上您可以指出您实际打算调用哪个方法,但在这种情况下,我使用类加载器来加载一个类,该类具有包含示例代码的方法。
\n\n\n编译器如何知道我打算调用哪个方法?
\n
它检查参数并根据JLS \xc2\xa715.2描述的规则确定哪一个更具体
\n\n在你的情况下,调用:
\n\nbase.set("OTM4E_EFFLEVEL", "IE1 / STD", true)\nRun Code Online (Sandbox Code Playgroud)\n\n参数是String, String,boolean
它与第一个类匹配(为简洁起见,更改了参数名称)
\n\npublic class ObjectContext {\n public void set(String s, Object o, boolean b){\n //...\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n未调用第二个类,因为第三个参数是Object:
public class ObjectContextDecorator extends ObjectContext {\n\n public void set(String s, String ss, Object thisOneRightHere) {\n //...\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n虽然布尔值true可以匹配(如果自动装箱),但第一个值更具体。这里应用的规则是:
\n\n\n第一阶段 (\xc2\xa715.12.2.2) 执行重载解析,不允许装箱或拆箱转换
\n
但是,例如,如果您Boolean在签名中使用对象包装器:
public class ObjectContext {\n public void set(String s, Object o, Boolean b){ //<-- third param changed from boolean to Boolean\n //...\n }\n}\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n\n但您的示例并非如此。
\n| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |