6

重複の可能性:
パラメーターの実際のタイプに基づくオーバーロードされたメソッドの選択
パラメーターがリテラルのnull値である場合、オーバーロードされたメソッドはどのように選択されますか?

以下のコードを実行すると、次の出力が得られます。

文字列引数が呼び出されたメソッド...」

なんで?

public class StringObjectPOC {

    public static void test(Object o)   {
        System.out.println("Method with Object argument Called ...");
    }
    public static void test(String str){
        System.out.println("Method with String argument Called ...");
    }
    public static void main(String[] args) {
        StringObjectPOC.test(null);
    }
}
4

5 に答える 5

3

呼び出しのnullは、両方のtest()シグニチャと一致します。をキャストして、nullどちらか一方を呼び出すようにする必要があります。

于 2012-10-30T05:32:01.723 に答える
3

私が正しく思い出せば、同様の例はJavaパズルからのものです。

nullStringタイプまたはタイプにすることができますObject。ただし、JVMは常により正確な方法を選択します。

この場合、よりString正確ですObject。(aStringはですObjectが、でObjectはない場合がありますString)。

このようなコードを書くのは良い習慣ではありません。次のように、目的のメソッドに一致するようにパラメータをキャストしてみてください

public class StringObjectPOC {

    public static void test(Object o)   {
        System.out.println("Method with Object argument Called ...");
    }
    public static void test(String str){
        System.out.println("Method with String argument Called ...");
    }
    public static void main(String[] args) {
        StringObjectPOC.test((Object)null);
    }
}
于 2012-10-30T05:34:20.180 に答える
2

Javaは、呼び出すことができる最も具体的なメソッドを見つけようとします。Stringはオブジェクトのサブクラスであるため、Javaは可能な限りStringメソッドに従います。nullは、オブジェクトまたは文字列のいずれに対しても完全に許容できる値ですが、文字列はオブジェクトよりも具体的であるため、Javaはより正確であるため、Stringメソッドに従います。

于 2012-10-30T05:36:16.247 に答える
2

私はこれを試しました:

Test2.class

public class Test2{}

Test3.class

public class Test3 extends Test2{

}

Test.class

public class Test{

public static void print(Object obj){
    System.out.println("Object");
}

public static void print(Test2 obj){
    System.out.println("test 2");
}

public static void print(Test3 obj){
    System.out.println("Test 3");
}


public static void main(String[]args){
    Test.print(null);
}

}

テスト3を印刷しました

シナリオと同じように、これは、メソッドがオーバーロードされた場合(およびnullが渡された場合)、子のほとんどのパラメーターを持つメソッドを認識することを意味します。

Object->Test->Test2

またはあなたの場合:

Object->String
于 2012-10-30T05:41:05.833 に答える
1

nullStringは、および/またはの両方である可能性がありますが、から継承するObjectため、より正確な署名を使用しようとします。キャストして、実行するメソッドを選択できます。StringObjectnull

public static void main(String[] args) {
    Test.test((Object) null); // treats as Object
    Test.test((String) null); // treats as String
    Test.test(null);          // treats as String
}
于 2012-10-30T05:36:53.920 に答える