He agregado tres métodos con parámetros:
public static void doSomething(Object obj) {
System.out.println("Object called");
}
public static void doSomething(char[] obj) {
System.out.println("Array called");
}
public static void doSomething(Integer obj) {
System.out.println("Integer called");
}
Cuando llamo doSomething(null)
, el compilador arroja el error como métodos ambiguos . Entonces, ¿es el problema porque Integer
y los char[]
métodos o Integer
y los Object
métodos?
java
oop
null
overloading
Phani
fuente
fuente
Integer
aint
.reference to doSomething is ambiguous
error.Respuestas:
Java siempre intentará usar la versión aplicable más específica de un método que esté disponible (consulte JLS §15.12.2 ).
Object
,char[]
yInteger
todos pueden tomarsenull
como un valor válido. Por lo tanto, las 3 versiones son aplicables, por lo que Java tendrá que encontrar la más específica.Como
Object
es el supertipo dechar[]
, la versión de matriz es más específica que laObject
versión. Entonces, si solo existen esos dos métodos,char[]
se elegirá la versión.Cuando están disponibles las versiones
char[]
yInteger
, ambas son más específicas queObject
ninguna, pero ninguna es más específica que la otra, por lo que Java no puede decidir a cuál llamar. En este caso, tendrá que mencionar explícitamente a cuál desea llamar enviando el argumento al tipo apropiado.Tenga en cuenta que en la práctica este problema ocurre mucho más raramente de lo que uno podría pensar. La razón de esto es que solo sucede cuando está llamando explícitamente a un método con
null
o con una variable de un tipo bastante inespecífico (comoObject
).Por el contrario, la siguiente invocación sería perfectamente inequívoca:
Aunque todavía está pasando el valor
null
, Java sabe exactamente a qué método llamar, ya que tendrá en cuenta el tipo de variable.fuente
Cada par de estos tres métodos es ambiguo en sí mismo cuando se llama con un
null
argumento. Porque cada tipo de parámetro es un tipo de referencia.Las siguientes son las tres formas de llamar a un método específico suyo con nulo.
¿Puedo sugerir eliminar esta ambigüedad si realmente planea llamar a estos métodos con
null
argumentos? Tal diseño invita a errores en el futuro.fuente
Integer
: elchar[]
par es ambiguo, porque en otros dos casos, el compilador de Java puede elegir la opción más específica, como se describe en @JoachimSauer.null
como parámetro. Bajo esa precondición, los tres pares son ambiguos. Para el caso general, estoy de acuerdo en que solo elInteger - char[]
par es ambiguo.doSomething(null)
conpublic static void doSomething(String str) { System.out.println("String called"); }
Esto devolverá la cadena llamada.null
es un valor válido para cualquiera de los tres tipos; entonces el compilador no puede decidir qué función usar. Use algo comodoSomething((Object)null)
o en sudoSomething((Integer)null)
lugar.fuente
Cada clase en Java extiende la clase Object. Incluso la clase Integer también extiende Object. Por lo tanto, tanto Object como Integer se consideran como instancia de Object. Entonces, cuando pasa nulo como parámetro, el compilador se confunde a qué método de objeto llamar, es decir, con parámetro Objeto o parámetro Entero, ya que ambos son objeto y su referencia puede ser nula. Pero las primitivas en java no extienden Object.
fuente
He intentado esto y cuando hay exactamente un par de métodos sobrecargados y uno de ellos tiene un tipo de parámetro Object, el compilador siempre seleccionará el método con un tipo más específico. Pero cuando hay más de un tipo específico, el compilador arroja un error de método ambiguo.
Dado que este es un evento de tiempo de compilación, esto solo puede suceder cuando uno intencionalmente pasa nulo a este método. Si esto se hace intencionalmente, es mejor sobrecargar este método nuevamente sin ningún parámetro o crear otro método por completo.
fuente
existe una ambigüedad debido a doSomething (char [] obj) y doSomething (Integer obj).
char [] e Integer son superiores para nulo, por eso son ambiguos.
fuente
El resultado es Int llamado nulo y la ambigüedad es con char [] e Integer
fuente