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.