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

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 progtwigció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 comstackción.

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 comstackdor no puede decidir entre el método que toma un Entero y el método que toma una Cadena. Cuando bash comstackr 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 

Ninguno. Obtendrá un error de comstackció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 comstackción.