Поиск по сайту:

«Метод X неоднозначен для типа Y» Неоднозначный метод Java вызывает нулевую ошибку


Если вы читаете это, скорее всего, вы получили Метод X неоднозначен для ошибки типа Y при компиляции Java-программы в терминале или любой Java IDE.

Неоднозначный вызов метода 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");
}
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, пожалуйста, прокомментируйте, если вы хотите что-то добавить или если у вас есть какая-то путаница с этим.