オーバーロードの解決: Null リテラルの解釈
Java では、Null リテラルは任意のオブジェクト変数に割り当てることができる有効な参照です。これには、String などの参照型のものも含まれます。この動作は、パラメーターが null として渡された場合にオーバーロードされたメソッドを解決する際に重要な役割を果たします。
次のコード スニペットを考えてみましょう。
public class MoneyCalc { public void method(Object o) { System.out.println("Object Verion"); } public void method(String s) { System.out.println("String Version"); } public static void main(String args[]) { MoneyCalc question = new MoneyCalc(); question.method(null); } }
この例では、メソッドメソッドが次のように呼び出されます。 null リテラルの場合、Java コンパイラは、method(Object o) オーバーロードではなく、method(String s) オーバーロードを選択します。この動作は、最も具体的なオーバーロード解決の原則によって説明されます。
Java 言語仕様 (JLS) によれば、コンパイラは「最も具体的な」オーバーロード、つまり「最も具体的な」オーバーロードを選択します。コンパイル時の型エラーなしで呼び出しを渡すことができます。」ここで、null リテラルはエラーなしでメソッド(String s) オーバーロードに渡すことができますが、メソッド(Object o) オーバーロードには渡すことができません。
したがって、Java コンパイラはメソッド(String s) オーバーロードを選択します。 、プログラムの出力は「文字列バージョン」です。
ただし:
... public void method(StringBuffer sb) { System.out.println("StringBuffer Verion"); } ...
StringBuffer パラメーターを受け入れるために 3 番目のオーバーロードが追加されると、コードはコンパイルされません。これは、method(String s) とmethod(StringBuffer sb) の両方のオーバーロードが同じように固有であるため、あいまいさが生じ、コンパイラーが最適なオーバーロードを選択できなくなるためです。
以上がメソッドのオーバーロードに Null を渡すと、オブジェクトのバージョンではなく文字列のバージョンが選択されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。