1

あいまいなメソッドエラーを生成する代わりに、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 コミュニティで議論を行うための良い出発点です。ええと、ありがとう!

4

0 に答える 0