“El método X es ambiguo para el tipo Y” Error de llamada de método ambiguo en Java nulo

Si estás leyendo esto, es probable que hayas obtenido el error El método X es ambiguo para el tipo Y al compilar un programa Java en la terminal o en cualquier IDE de Java.

Llamada de método ambiguo en Java

Aquí voy a explicar por qué ocurre el error de llamada de método ambiguo en Java con algunos ejemplos. Este error de llamada de método ambiguo siempre aparece con la sobrecarga de métodos, donde el compilador no puede determinar cuál de los métodos sobrecargados debe utilizarse. Supongamos que tenemos un programa Java como el siguiente.

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

}

El programa anterior se compila perfectamente y, al ejecutarlo, imprime “String”. Por lo tanto, el método foo(String s) fue llamado por el programa. La razón de esto es que el compilador de Java intenta encontrar el método con los parámetros de entrada más específicos para invocar un método. Sabemos que Object es la clase padre de String, por lo que la elección fue fácil. Aquí está el fragmento de la Especificación del Lenguaje Java.

Si más de un método miembro es tanto accesible como aplicable a una invocación de método … El lenguaje de programación Java utiliza la regla de que se elige el método más específico.

La razón por la que paso “null” es porque funciona para cualquier tipo de argumentos, si pasamos cualquier otro objeto la elección del método para el compilador de Java es fácil.

El método X es ambiguo para el tipo Y

Ahora agreguemos el siguiente método al código anterior.

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

Obtendrás un error en tiempo de compilación como El método foo(Object) es ambiguo para el tipo Test porque tanto la clase String como la clase Integer tienen a Object como clase padre y no hay herencia. Por lo tanto, el compilador de Java no considera ninguno de ellos como más específico, de ahí el error de llamada de método ambiguo.

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 se explicó anteriormente, aquí foo(NullPointerException ne) es el método más específico porque es heredado de la clase Exception y por lo tanto este código se compila bien y cuando se ejecuta imprime “NullPointerException”. Espero que este artículo aclare cualquier duda que tengas con el error de compilador de Java de llamada de método ambiguo, por favor comenta si quieres agregar algo o si tienes alguna confusión con esto.

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