“O método X é ambíguo para o tipo Y” Java chamada de método ambígua erro nulo

Se estás a ler isto, é provável que tenhas obtido o erro O método X é ambíguo para o tipo Y ao compilar um programa Java no terminal ou em qualquer IDE Java.

Chamada de método ambígua em Java

Aqui vou explicar por que ocorre o erro de chamada de método ambíguo em Java com alguns exemplos. Este erro de chamada de método ambíguo ocorre sempre com sobrecarga de método, onde o compilador falha em determinar qual dos métodos sobrecarregados deve ser usado. Suponhamos que tenhamos um programa Java como abaixo.

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);
	}

}

O programa acima compila perfeitamente e, quando o executamos, imprime “String”. Assim, o método foo(String s) foi chamado pelo programa. A razão para isso é que o compilador Java tenta encontrar o método com os parâmetros de entrada mais específicos para invocar um método. Sabemos que Object é a classe pai de String, então a escolha foi fácil. Aqui está um excerto da Especificação da Linguagem Java.

Se mais de um método membro for acessível e aplicável a uma invocação de método … A linguagem de programação Java utiliza a regra de que o método mais específico é escolhido.

A razão pela qual estou passando “null” é porque funciona para qualquer tipo de argumentos, se passarmos outros objetos, a escolha do método para o compilador Java é fácil.

O método X é ambíguo para o tipo Y

Agora, vamos adicionar o método abaixo ao código acima.

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

Você receberá um erro de compilação como O método foo(Object) é ambíguo para o tipo Teste porque tanto a classe String quanto a classe Integer têm a classe Object como classe pai e não há herança. Portanto, o compilador Java não considera nenhum deles mais específico, resultando no erro de chamada de método ambíguo.

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);
	}

}

Como explicado acima, aqui foo(NullPointerException ne) é o método mais específico porque é herdado da classe Exception, e, portanto, esse código compila corretamente e, quando executado, imprime “NullPointerException”. Espero que este artigo esclareça qualquer dúvida que você tenha sobre o erro do compilador Java de chamada de método ambíguo. Por favor, comente se quiser adicionar algo ou se tiver alguma dúvida sobre isso.

Source:
https://www.digitalocean.com/community/tutorials/the-method-is-ambiguous-for-the-type-java-ambiguous-method-call-null-error