53

この行をJavaで書くと、次のようになります。

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

どのメソッドが呼び出されますか?

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

私はそれをテストすることができます。しかし、これと同様の他のケースでは、私は何が起こるか知りたいです。

4

3 に答える 3

64

最も具体的なメソッドが呼び出されます-この場合

showInputDialog(Component parent, Object message)

これは通常、仕様(15.12.2)の過負荷解決の「メソッドシグネチャの決定」ステップ、特に「最も具体的なメソッドの選択」に該当します。

詳細(ここと同じように仕様で読むことができます)に立ち入ることなく、導入部は良い要約を提供します:

複数のメンバーメソッドがアクセス可能であり、メソッド呼び出しに適用できる場合は、実行時メソッドディスパッチの記述子を提供するために1つを選択する必要があります。Javaプログラミング言語は、最も具体的な方法が選択されるという規則を使用します。

非公式の直感では、最初のメソッドによって処理された呼び出しがコンパイル時の型エラーなしで他のメソッドに渡される可能性がある場合、1つのメソッドは別のメソッドよりも具体的です。

于 2009-10-09T18:59:33.087 に答える
13

特定のケースでは、より具体的なメソッドが呼び出されます。ただし、一般的に、メソッドのシグネチャがあいまいになる場合があります。次のことを考慮してください。

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...");
    }
}

この場合、コンパイラは整数を受け取るメソッドと文字列を受け取るメソッドのどちらかを決定できません。それをコンパイルしようとすると、

reference to testNullArgument is ambiguous, both method testNullArgument(java.lang.Integer) in testnullargument.Main and method testNullArgument(java.lang.String) in testnullargument.Main match
于 2009-10-09T19:10:14.893 に答える
9

ない。呼び出すメソッドを明確にするように求めるコンパイラエラーが発生します。これを行うには、最初の引数を明示的にキャストします。

showInputDialog((Object) null, "Write something");

また

showInputDialog((Component) null, "Write something");

知っておくべきアップデート-JonSkeetを疑うことはありません。上記で言及した問題は、どちらの方法がより具体的であるかを判断できない場合にのみ発生します。テストケースは次のとおりです。

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

上記の場合、コンパイラエラーが発生します。

于 2009-10-09T18:59:53.133 に答える