メソッドXはタイプYに対して曖昧です。Javaの曖昧なメソッド呼び出しのnullエラーです。
これを読んでいるなら、おそらくJavaプログラムをターミナルやどんなJava IDEでコンパイルする際に、メソッドXは型Yに対して曖昧なエラーが発生しました。
Javaの曖昧なメソッド呼び出し
以下では、いくつかの例を使用して、なぜJavaの曖昧なメソッド呼び出しエラーが発生するのかを説明します。この曖昧なメソッド呼び出しエラーは常にメソッドのオーバーロードと一緒に現れ、コンパイラがどのオーバーロードされたメソッドを使用するか判断できなくなる場合に発生します。以下のようなJavaプログラムがあるとします。
package com.scdev.errors;
public class Test {
public void foo(Object o) {
System.out.println("Object");
}
public void foo(String s) {
System.out.println("String");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
上記のプログラムは完璧にコンパイルされ、実行すると「String」と出力されます。したがって、プログラムによってメソッドfoo(String s)が呼び出されました。これは、Javaコンパイラが最も特殊な入力パラメータを持つメソッドを呼び出そうとするためです。Stringの親クラスはObjectであることを知っているため、選択は簡単でした。以下はJava言語仕様の一部です。
もし複数のメンバーメソッドがメソッドの呼び出しにアクセス可能かつ適用可能である場合、Javaプログラミング言語は最も具体的なメソッドを選択するルールを使用します。
「null」を渡す理由は、それがどのようなタイプの引数でも機能するからです。他のオブジェクトを渡すと、Javaコンパイラのメソッドの選択が容易になります。
方法XはタイプYについてはあいまいです。
今、上記のコードに以下のメソッドを追加しましょう。 (Ima, jōki no kōdo ni ika no mesoddo o tsuika shimashou.)
public void foo(Integer i){
System.out.println("Integer");
}
テストのタイプに対して、メソッド「foo(Object)」は曖昧です。StringクラスとIntegerクラスの両方が親クラスとしてObjectを持ち、継承関係がないため、コンパイル時エラーが発生します。そのため、Javaコンパイラはどちらもより具体的とは見なさず、メソッドの呼び出しエラーが起こります。
package com.scdev.strings;
public class Test {
public void foo(Object o) {
System.out.println("Object");
}
public void foo(Exception e) {
System.out.println("Exception");
}
public void foo(NullPointerException ne) {
System.out.println("NullPointerException");
}
public static void main(String[] args) {
new Test().foo(null);
}
}
上述の説明の通り、foo(NullPointerException ne)は最も具体的なメソッドです。これはExceptionクラスから継承されているため、このコードは問題なくコンパイルされ、実行されると「NullPointerException」と出力されます。この記事がJavaの曖昧なメソッド呼び出しコンパイラエラーについての疑問を解消するお手伝いとなれば幸いです。もし何か追加したいことや疑問があれば、コメントしてください。