studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java parameters methods invocation

programacion - ¿Qué sobrecarga se seleccionará para nulo en Java?



manual de programacion android pdf (3)

En su caso particular, se llamará al método más específico. En general, sin embargo, hay algunos casos donde la firma del método puede ser ambigua. Considera lo siguiente:

public class Main { public static void main(String[] args) { Main m = new Main(); m.testNullArgument(null); } private void testNullArgument( Object o ) { System.out.println("An Object was passed..."); } private void testNullArgument( Integer i ) { System.out.println("An Integer was passed..."); } private void testNullArgument( String s ) { System.out.println("A String was passed..."); } }

En este caso, el compilador no puede decidir entre el método que toma un Entero y el método que toma una Cadena. Cuando intento compilar eso, obtengo

reference to testNullArgument is ambiguous, both method testNullArgument(java.lang.Integer) in testnullargument.Main and method testNullArgument(java.lang.String) in testnullargument.Main match

Si escribo esta línea en Java:

JOptionPane.showInputDialog(null, "Write something");

¿Qué método se llamará?

  • showInputDialog(Component parent, Object message)
  • showInputDialog(Object message, Object initialSelectionValue)

Puedo probarlo. Pero en otros casos similares a esto, quiero saber qué sucede.


Se llamará el método más específico - en este caso

showInputDialog(Component parent, Object message)

Esto generalmente viene bajo el paso "Determinar la firma del método" de la resolución de sobrecarga en la especificación (15.12.2) y, en particular, "Elegir el método más específico" .

Sin entrar en los detalles (que puede leer tan bien en la especificación como aquí), la introducción ofrece un buen resumen:

Si más de un método de miembro es accesible y aplicable a una invocación de método, es necesario elegir uno para proporcionar el descriptor para el envío del método en tiempo de ejecución. El lenguaje de programación Java usa la regla de que se elige el método más específico .

La intuición informal es que un método es más específico que otro si cualquier invocación manejada por el primer método podría pasarse a la otra sin un error de tipo de tiempo de compilación.


Ninguno. Obtendrá un error de compilación que le pedirá que aclare a qué método desea llamar. Puedes hacerlo lanzando explícitamente el primer argumento:

showInputDialog((Object) null, "Write something");

o

showInputDialog((Component) null, "Write something");

Actualización Debería haberlo sabido, nunca dude de Jon Skeet. El problema al que me he referido anteriormente solo ocurre cuando es imposible determinar qué método es más específico. Aquí hay un caso de prueba:

public class Test { public void doSomething(String arg1, Object arg2) { System.out.println("String, Object"); } public void doSomething(Object arg1, String arg2) { System.out.println("Object, String"); } public static void main(String[] args) { Test test = new Test(); test.doSomething(null, null); } }

Lo anterior dará un error de compilación.