1. ホーム
  2. java

[解決済み] NULL引数のメソッドオーバーローディング

2022-05-02 12:06:42

質問

パラメータを持つ3つのメソッドを追加しました。

public static  void doSomething(Object obj) {
    System.out.println("Object called");
}

public static  void doSomething(char[] obj) {
    System.out.println("Array called");
}

public static  void doSomething(Integer obj) {
    System.out.println("Integer called");
}

を呼び出しているとき doSomething(null) というエラーを投げます。 あいまいなメソッド . ということで、問題は Integerchar[] メソッドまたは IntegerObject メソッドですか?

どのように解決するのですか?

Javaは常に、利用可能なメソッドの中で最も具体的に適用可能なバージョンを使用しようとします( JLS §15.12.2 ).

Object , char[]Integer はすべて null を有効な値として使用します。したがって、3つのバージョンすべてが適用可能であり、Javaは最も具体的なものを見つけなければならないでしょう。

このため Object のスーパータイプです。 char[] よりも具体的であり、配列バージョンは Object -のバージョンです。ですから、もしこの2つのメソッドだけが存在するのであれば char[] のバージョンが選択されます。

の両方が存在する場合 char[]Integer のバージョンが利用可能であれば 両方 よりも具体的である。 Object そのため、Javaはどちらを呼び出すか決定できない。この場合、引数を適切な型にキャストすることで、どちらを呼び出したいかを明示的に記述する必要があります。

なお、実際には、このような問題が発生することは、想像以上に少ない。というのも、この問題が発生するのは、明示的に null のような特殊でない型の変数(例えば Object ).

逆に、次のような呼び出しは、完全に曖昧さがなくなります。

char[] x = null;
doSomething(x);

という値を渡していますが null Javaは変数の型を考慮するので、どのメソッドを呼び出すべきかを正確に知っています。