Como se mencionó anteriormente, la resolución de sobrecarga se realiza en tiempo de compilación.
Java Puzzlers tiene un buen ejemplo de eso:
Rompecabezas 46: El caso del constructor confuso
Este rompecabezas te presenta dos constructores confusos. El método principal invoca un constructor, pero ¿cuál? La salida del programa depende de la respuesta. ¿Qué imprime el programa, o incluso es legal?
public class Confusing {
private Confusing(Object o) {
System.out.println("Object");
}
private Confusing(double[] dArray) {
System.out.println("double array");
}
public static void main(String[] args) {
new Confusing(null);
}
}
Solución 46: Caso del constructor confuso
... El proceso de resolución de sobrecargas de Java opera en dos fases. La primera fase selecciona todos los métodos o constructores que son accesibles y aplicables. La segunda fase selecciona el más específico de los métodos o constructores seleccionados en la primera fase. Un método o constructor es menos específico que otro si puede aceptar cualquier parámetro pasado al otro [JLS 15.12.2.5].
En nuestro programa, ambos constructores son accesibles y aplicables. El constructor
Confusing (Object) acepta cualquier parámetro pasado a Confusing (doble []) , por lo que
Confusing (Object) es menos específico. (Cada matriz doble es un Objeto , pero no todo Objeto es una matriz doble ). Por lo tanto, el constructor más específico es Confuso (doble []) , que explica la salida del programa.
Este comportamiento tiene sentido si pasa un valor de tipo double [] ; es contrario a la intuición si pasa null . La clave para entender este acertijo es que la prueba para qué método o constructor es más específico no usa los parámetros reales : los parámetros que aparecen en la invocación. Se utilizan solo para determinar qué sobrecargas son aplicables. Una vez que el compilador determina qué sobrecargas son aplicables y accesibles, selecciona la sobrecarga más específica, utilizando solo los parámetros formales: los parámetros que aparecen en la declaración.
Para invocar el constructor Confusing (Object) con un parámetro nulo , escriba nuevo Confusing ((Object) null) . Esto asegura que solo se aplique Confuso (Objeto) . De manera más general, para obligar al compilador a seleccionar una sobrecarga específica, convierta los parámetros reales en los tipos declarados de los parámetros formales.