ホームページ > Java > &#&チュートリアル > Java のオーバーロードされたメソッド選択では、「null」が渡されたときに「method(String s)」が選択されるのはなぜですか?

Java のオーバーロードされたメソッド選択では、「null」が渡されたときに「method(String s)」が選択されるのはなぜですか?

Susan Sarandon
リリース: 2024-11-07 04:47:02
オリジナル
823 人が閲覧しました

 Why does Java's overloaded method selection choose `method(String s)` when passed `null`?

Null パラメータを使用したオーバーロードされたメソッドの選択

次の Java コードを考えてみましょう:

public クラスMoneyCalc {</p>
<p>public void メソッド(Object o) {</p>
<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">  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 値を渡すときに選択されるオーバーロード メソッドは、「method(String s )" 方法。 null は String 変数として明示的に宣言されていないため、これは直観に反しているように思えるかもしれません。

オブジェクトとしての Null を理解する

「オブジェクト バージョン」という名前にもかかわらず、 「method(Object o)」オーバーロードはオブジェクトに限定されません。 Java では、null を String を含む任意のクラス型の式に変換できます。したがって、次の割り当ては有効です:

String x = null;<br>

メソッドの特異性の決定

Java コンパイラは、Java 言語に従って最も具体的なオーバーロードを選択します。仕様 (JLS) セクション 15.12.2.5。非公式には、メソッドで処理される呼び出しがコンパイル時の型エラーなしで別のメソッドでも処理できる場合、メソッドはより具体的になります。

この場合、「method(String s)」オーバーロードはより具体的です。文字列引数を使用した呼び出しを処理できます。一方、「method(Object o)」オーバーロードは、null を含む任意のオブジェクト型を処理できます。ただし、キャストせずに String 引数を使用した呼び出しを処理することはできないため、コンパイル時エラーが発生します。コードを変更して追加の「method(StringBuffer sb)」オーバーロードを含めると、あいまいなオーバーロードが発生します。エラー:

public class MoneyCalc {</p>
<p>public void メソッド(StringBuffer sb) {</p>
<p></p>}<p></p>public void メソッド(文字列) {<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">  System.out.println("StringBuffer Verion");
ログイン後にコピー

}

public static void main(String args[]) {
  System.out.println("String Version");
ログイン後にコピー
ログイン後にコピー

}

}

  MoneyCalc question = new MoneyCalc();
  question.method(null);
ログイン後にコピー
ログイン後にコピー

これは、「メソッド(StringBuffer) sb)" と "method(String s)" オーバーロードは、他よりも具体的です。どちらも null 引数を処理できますが、どちらもキャストせずにもう一方の引数の型を処理することはできません。

以上がJava のオーバーロードされたメソッド選択では、「null」が渡されたときに「method(String s)」が選択されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
前の記事:Java で数値に「L」を追加すると、乗算演算の結果が大幅に変わるのはなぜですか? 次の記事:Android でウィジェットの行折り返しを実現するにはどうすればよいですか?
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
最新の問題
関連トピック
詳細>
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート