如果我用Java写这行:
JOptionPane.showInputDialog(null, "Write something");
将调用哪种方法?
showInputDialog(Component parent, Object message)
showInputDialog(Object message, Object initialSelectionValue)
我可以测试一下。但在其他类似的情况下,我想知道会发生什么。
答案 0 :(得分:62)
将调用最具体的方法 - 在本例中为
showInputDialog(Component parent, Object message)
这通常属于规范(15.12.2)中重载决策的"Determine Method Signature"步骤,特别是"Choosing the Most Specific Method"。
没有详细介绍(您可以在此处的规范中阅读),介绍提供了一个很好的总结:
如果两个成员方法都有多个 方法可访问和适用 调用,有必要选择 一个提供描述符 运行时方法调度。 Java 编程语言使用规则 最具体的方法是 选择的。
非正式的直觉就是那个 方法比另一种方法更具体 如果任何调用由第一个处理 方法可以传递给另一方 一个没有编译时类型错误。
答案 1 :(得分:12)
在您的特定情况下,将调用更具体的方法。但是,一般情况下,某些情况下方法签名可能不明确。请考虑以下事项:
public class Main {
public static void main(String[] args) {
Main m = new Main();
m.testNullArgument(null);
}
private void testNullArgument( Object o )
{
System.out.println("An Object was passed...");
}
private void testNullArgument( Integer i )
{
System.out.println("An Integer was passed...");
}
private void testNullArgument( String s )
{
System.out.println("A String was passed...");
}
}
在这种情况下,编译器无法决定采用Integer的方法和采用String的方法。当我尝试编译时,我得到了
reference to testNullArgument is ambiguous, both method testNullArgument(java.lang.Integer) in testnullargument.Main and method testNullArgument(java.lang.String) in testnullargument.Main match
答案 2 :(得分:9)
<击>都不是。您将收到编译器错误,要求您说明要调用的方法。您可以通过显式转换第一个参数来执行此操作:
showInputDialog((Object) null, "Write something");
或
showInputDialog((Component) null, "Write something");
击> <击> 撞击>
更新我应该知道 - 永远不要怀疑Jon Skeet。我上面提到的问题只发生在无法确定哪种方法更具体的情况下。这是一个测试用例:
public class Test {
public void doSomething(String arg1, Object arg2) {
System.out.println("String, Object");
}
public void doSomething(Object arg1, String arg2) {
System.out.println("Object, String");
}
public static void main(String[] args) {
Test test = new Test();
test.doSomething(null, null);
}
}
以上将给出编译器错误。