あいまいなメソッドエラーを生成する代わりに、Java が実行method(char[] a)
されmethod(null)
ているのはなぜですか?method(Object a)
静的メソッドを使用して文字列を作成しようとするとString.valueOf()
...この状況に直面します。以下の自明ですぐに実行できる例を参照してください。
public class NotSoClearNullPointerException {
public static void main(String[] args) {
NotSoClearNullPointerException instance = new NotSoClearNullPointerException ();
instance.algo(null);
String str = String.valueOf(instance.getANull());
System.out.println ("This actually is beign send to stdout : " + str);
str = String.valueOf(null);
System.out.println ("We never gonna make it to stdout!! : " + str);
}
public Object getANull() {
return null; // the hardest method i ever wrote... xD
}
}
String クラスのソースを確認した後、String.valueOf(Object) メソッドが null-safe であることがわかりました!!したがって、String.valueOf(null)
実際にはString.valueOf(Object)
メソッドを呼び出しているのではなく、別のオーバーロードされたメソッドを呼び出しString.valueOf(char[])
ています。すべての配列( にもかかわらずbase type
)がオブジェクトであることを知っています。
私は自分のテストを作成しているので、これはかなり確信しています。
public class ArgumentDispatchExample {
public static void main(String[] args) {
ArgumentDispatchExample instance = new ArgumentDispatchExample ();
instance.method(null);
}
public void method (Object a) {
System.out.println("Object");
}
public void method (char[] a) {
System.out.println("char[]");
}
}
私が正しいと仮定すると...(ちなみに、これは質問の一部です...)、「null」をObject または char[] インスタンスに。
Java はダブル ディスパッチ (つまり、引数の実際の型を調べて呼び出すメソッドを解決すること) をサポートしていません。では、null を char[] として取得する決定を下すために、ここではどのような規則を使用しているのでしょうか? 私の人生を通して、nullは他の種類の抽象化よりもオブジェクトの「もの」に近いと思います。
「more」はどのような型に null 値を関連付けますか?
回答お待ちしております!!
ご挨拶。
ビクター
PD: HPO (謙虚な個人的意見) として... 特に最初の例を見ると、混乱することに同意しませんか? おそらく、これは Java コミュニティで議論を行うための良い出発点です。ええと、ありがとう!