Если вы читаете это, вероятно, вы получили ошибку The method X is ambiguous for the type Y
при компиляции программы на Java в терминале или в любой среде разработки Java.
Неоднозначный вызов метода в 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.
Если более одного метода член доступны и применимы для вызова метода … Язык программирования Java использует правило выбора наиболее конкретного метода.
Причина, по которой я передаю “null”, заключается в том, что это работает для любого типа аргументов, если мы передаем какие-либо другие объекты, выбор метода для компилятора Java становится простым.
Метод X неоднозначен для типа Y
Теперь давайте добавим нижеследующий метод к вышеуказанному коду.
public void foo(Integer i){
System.out.println("Integer");
}
Вы получите ошибку времени компиляции в виде
Метод foo(Object) неоднозначен для типа Test
, потому что и класс 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 при вызове неоднозначного метода, пожалуйста, прокомментируйте, если вы хотите добавить что-то или если у вас есть некоторые путаница по этому поводу.