次の Java コードを考えてみましょう:
public クラスMoneyCalc {</p> <p>public void メソッド(Object o) {</p> <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 変数として明示的に宣言されていないため、これは直観に反しているように思えるかもしれません。
「オブジェクト バージョン」という名前にもかかわらず、 「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 メソッド(文字列) {<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 サイトの他の関連記事を参照してください。