在Java中选择哪个重载为空?

时间:2009-10-09 18:57:12

标签: java parameters methods invocation

如果我用Java写这行:

JOptionPane.showInputDialog(null, "Write something");

将调用哪种方法?

  • showInputDialog(Component parent, Object message)
  • showInputDialog(Object message, Object initialSelectionValue)

我可以测试一下。但在其他类似的情况下,我想知道会发生什么。

3 个答案:

答案 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);
  }
}

以上将给出编译器错误。