ホームページ > Java > &#&チュートリアル > メソッドのオーバーロードに Null を渡すと、オブジェクトのバージョンではなく文字列のバージョンが選択されるのはなぜですか?

メソッドのオーバーロードに Null を渡すと、オブジェクトのバージョンではなく文字列のバージョンが選択されるのはなぜですか?

Susan Sarandon
リリース: 2024-11-19 15:54:02
オリジナル
600 人が閲覧しました

Why Does Passing Null to a Method Overload Choose the String Version Over the Object Version?

オーバーロードの解決: 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート