Me di cuenta hoy que el auto-boxing a veces puede causar ambigüedad en la resolución de sobrecarga del método. El ejemplo más simple parece ser esta:¿Por qué el autoboxing hace que algunas llamadas sean ambiguas en Java?
public class Test {
static void f(Object a, boolean b) {}
static void f(Object a, Object b) {}
static void m(int a, boolean b) { f(a,b); }
}
cuando se compila, que hace que el siguiente error:
Test.java:5: reference to f is ambiguous, both method
f(java.lang.Object,boolean) in Test and method
f(java.lang.Object,java.lang.Object) in Test match
static void m(int a, boolean b) { f(a, b); }
^
La solución a este error es trivial: sólo tiene que utilizar explícita de auto-boxing:
static void m(int a, boolean b) { f((Object)a, b); }
que llama correctamente a la primera sobrecarga como se esperaba.
Entonces, ¿por qué falló la resolución de sobrecarga? ¿Por qué el compilador no seleccionó automáticamente el primer argumento y aceptó el segundo argumento normalmente? ¿Por qué tengo que solicitar auto-boxing de forma explícita?
Gracias @eljenso. Esto aclara el problema del compilador, pero luego me pregunto por qué la segunda fase se define así. ¿No podría modificarse con "hacer la menor cantidad posible de conversiones de boxeo/unboxing"? –
¡Excelente respuesta! –
Bueno, gracias @eljenso! Estoy de acuerdo en que, en su ejemplo, la llamada es ambigua. Creo que las dos sobrecargas costarán el mismo número de conversiones de boxeo, por lo que la llamada es ambigua. Pero (independientemente del JLS), no veo mi ejemplo ambiguo. ¿Qué piensas? –