もしこれを読んでいるなら、おそらくターミナルまたは任意のJava IDEでJavaプログラムをコンパイルする際にメソッドXは型Yに対して曖昧です
というエラーが出たでしょう。
Java 曖昧なメソッド呼び出し
ここでは、Javaの曖昧なメソッド呼び出しエラーがどのようにして発生するか、いくつかの例を示しながら説明します。この曖昧なメソッド呼び出しエラーは常に、コンパイラがどのオーバーロードされたメソッドを使用すべきか判断できない場合に発生します。以下のようなJavaプログラムがあるとします。
package com.journaldev.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コンパイラがメソッドを呼び出すために最も具体的な入力パラメータを持つメソッドを見つけようとするからです。私たちはObjectがStringの親クラスであることを知っているので、選択は簡単でした。以下はJava言語仕様からの抜粋です。
1つ以上のメンバーメソッドがメソッドの呼び出しに対してアクセス可能で適用可能な場合… Javaプログラミング言語は、最も具体的なメソッドが選択されるというルールを使用します。
私が「null」を渡す理由は、これがどんな種類の引数に対しても機能するからです。他のオブジェクトを渡すと、Javaコンパイラのメソッドの選択は簡単です。
メソッドXはタイプYに対して曖昧です
今度は上記のコードに以下のメソッドを追加しましょう。
public void foo(Integer i){
System.out.println("Integer");
}
StringとIntegerクラスの両方が親クラスとしてObjectを持っており、継承関係がないため、Javaコンパイラはそれらのいずれもをより具体的とは見なさず、したがってメソッドが曖昧な呼び出しエラーを発生させます。
package com.journaldev.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の曖昧なメソッド呼び出しコンパイラエラーに関する疑問を解消してくれたら幸いです。何か追加したいことがある場合や、この点について混乱している場合はコメントしてください。