¿Qué sobrecarga se seleccionará como nula en Java?

Resuelto Martijn Courteaux asked hace 14 años • 3 respuestas

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 este, quiero saber qué pasa.

Martijn Courteaux avatar Oct 10 '09 01:10 Martijn Courteaux
Aceptado

En su caso particular se llamará al método más específico. Sin embargo, en general, hay algunos casos en los que 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 número 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
Bill the Lizard avatar Oct 09 '2009 19:10 Bill the Lizard

Ni. Recibirá un error del compilador que le pedirá que aclare qué método desea llamar. Puedes hacerlo emitiendo explícitamente el primer argumento:

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

o

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

Actualización que debería haber sabido: nunca dudes de Jon Skeet. El problema al que me he referido anteriormente sólo 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.

ChssPly76 avatar Oct 09 '2009 18:10 ChssPly76