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.