Рубрики
Без рубрики

“Метод X неоднозначен для типа Y” Ошибка null вызова неоднозначного метода Java

“Метод X неоднозначен для типа Y” Ошибка вызова неоднозначного метода Java, неоднозначность в java, неоднозначный вызов метода java null, ошибка java неоднозначна

Автор оригинала: Pankaj Kumar.

Если вы читаете это, скорее всего, у вас есть Метод X неоднозначен для типа 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);
	}

}

Вышеуказанная программа отлично компилируется, и когда мы ее запускаем, она выводит “Строку”.

Таким образом, метод foo(строка s) был вызван программой. Причина этого в том, что компилятор java пытается найти метод с наиболее конкретными входными параметрами для вызова метода. Мы знаем, что объект является родительским классом строки, поэтому выбор был легким. Вот выдержка из спецификации языка Java.

Причина, по которой я передаю “null”, заключается в том, что он работает для любого типа аргументов, если мы передаем любые другие объекты, выбор метода для компилятора java прост.

Метод X неоднозначен для типа, который вы

Теперь давайте добавим приведенный ниже метод к приведенному выше коду.

public void foo(Integer i){
	System.out.println("Integer");
}

Вы получите ошибку во время компиляции, так как Метод foo(Объект) неоднозначен для теста типа , потому что как строковый, так и целочисленный класс имеют объект в качестве родительского класса и наследования не существует. Таким образом, компилятор 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) является наиболее специфичным методом, поскольку он унаследован от класса исключений, и, следовательно, этот код отлично компилируется и при выполнении выводит “Исключение NullPointerException”.

Я надеюсь, что эта статья прояснит любые сомнения, которые у вас есть в связи с ошибкой компилятора вызова неоднозначного метода java, пожалуйста, прокомментируйте, если вы хотите что-то добавить или если у вас есть некоторая путаница с этим.