1

このプログラムを実行すると、文字列パラメーターでオーバーロードされたメソッドが呼び出されるのはなぜですか。

public class StaticBindTest {

    public static void main(String args[])  {
       StaticBindTest et = new StaticBindTest();
       et.sort(null);

    }

    //overloaded method
    public void sort(Object c){
        System.out.println("Inside Collection sort method");
    }


   //another overloaded method
    public void sort(String hs){
        System.out.println("Inside HashSet sort method");
    }

}

メソッドを次のように書き直した場合

    public void sort(String hs){
        if(hs instanceof String)
        System.out.println("Inside HashSet sort method");
    }

空白のコンソールが表示されます。これは、String のインスタンスではないことを意味します。なぜこの方法で呼び出すのでしょうか?

4

3 に答える 3

3

メソッドのオーバーロードの場合

The most specific method is choosen at compile time.

「java.lang.String」は「java.lang.Object」よりも具体的なタイプです。あなたの場合、「文字列」をパラメータとして取るメソッドが選択されています。

DOCSに明確に記載されています

于 2013-04-24T07:45:32.530 に答える
1

Inside HashSet sort methodコードを実行すると、出力にあることがわかりました。nullオブジェクトへの空の参照です。どちらのメソッドも入力としてオブジェクトを持っているため、より狭い階層を持つメソッドStringが呼び出されます。オブジェクトなしで呼び出すだけ
です 。StaticBindTest et = new StaticBindTest();
sort(null)et

于 2013-04-24T07:47:48.927 に答える
0

完全な方法論はJLS のセクション 15.12.2 で説明されており、特に 15.12.2.5 (最も具体的なものを選択) で説明されています。

要約すると、Java は適用可能な最も具体的なオーバーロードを常に選択します。nullは任意のクラスのインスタンスになる可能性があるため、両方のメソッドが候補です。Stringは のサブクラスであるためObject、より具体的です。したがって、String オーバーロードが呼び出されます。

あなたの最後の段落についてnullは、何でもありませんinstanceof。Object-overload メソッドを同様の方法で記述した場合、何出力されないため、これは、Java がいずれかのオーバーロードを選択する必要があったかどうかについての強力な証拠ではありません。

于 2013-04-24T07:47:43.327 に答える