【发布时间】:2020-05-08 18:01:08
【问题描述】:
假设我有一个 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) {
//...
}
}
ObjectContextDecorator 和 ObjectContext 上的 set 方法非常相似。考虑这个示例代码:
ComponentBase base = new ComponentBase();
base.set(""OTM4E_EFFLEVEL"", ""IE1 / STD"", true);
这两种方法的签名都适合被正确调用的方法。我无法更改方法的签名,因为它不是我的代码。
编译器如何知道我打算调用哪个方法?
我知道在 IDE 上您可以指出您实际打算调用的方法,但在这种情况下,我使用类加载器来加载一个类,该类具有包含示例代码的方法。
【问题讨论】:
-
它们相似,但不同——如果您传入
String, String, boolean,则不会有歧义。将调用最具体的方法。这一切都在 JLS 中。 -
哪一个是最具体的?据我了解,它们都同样具体。
-
也就是说,即使编译器和 IDE 可以确定调用的是哪一个,但规则很复杂,人类很难弄清楚。所以我会重命名其中一种方法以使其显而易见。
-
旁注,java 字符串只使用一个双引号(如
"this")
标签: java overloading method-signature