“O método X é ambíguo para o tipo Y” Erro nulo na chamada ambígua do método Java

Se você está lendo isso, há chances de você ter recebido 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. Esse erro de chamada de método ambíguo sempre ocorre com sobrecarga de método, onde o compilador falha em determinar qual dos métodos sobrecarregados deve ser usado. Suponha 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”. Portanto, 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á o trecho da Especificação da Linguagem Java.

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

A razão pela qual estou passando “null” é porque isso 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 Test porque tanto a classe String quanto a classe Integer têm Object como classe pai e não há herança. Então, o compilador do Java não considera nenhum deles como mais específico, portanto, o 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, este código compila bem e, quando executado, imprime “NullPointerException”. Espero que este artigo esclareça qualquer dúvida que você tenha com o erro de compilador de chamada de método ambíguo do java, por favor, comente se você quiser adicionar algo ou se você tem alguma confusão com isso.

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