52 votes

Qui surcharge d'être sélectionné par la valeur null dans Java?

Si j'écris cette ligne en Java:

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

La méthode qui sera appelée?

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

Je peux le tester. Mais dans d'autres cas semblables à ceci, je veux savoir ce qui se passe.

63voto

Jon Skeet Points 692016

Le plus spécifique de la méthode sera appelée dans ce cas

showInputDialog(Component parent, Object message)

Cela vient généralement en vertu de la "Déterminer la Signature de la Méthode" étape de la résolution de surcharge dans la spec (15.12.2), et en particulier "le Choix de la Méthode Spécifique".

Sans entrer dans les détails (que vous pouvez lire tout aussi bien dans la spécification comme ici), l'introduction donne un bon résumé:

Si plus d'un membre de la méthode est à la fois accessible et applicable à une méthode invocation, il est nécessaire de choisir un pour fournir le descripteur de la au moment de l'exécution de la méthode d'expédition. La Java langage de programmation utilise la règle que le plus spécifique de la méthode est choisi.

Le secteur informel de l'intuition est que l'on la méthode est plus spécifique que l'autre si une invocation gérées par la première la méthode pourrait être transmis à d'autres sans un moment de la compilation type d'erreur.

13voto

Bill the Lizard Points 147311

Dans votre cas particulier, le plus spécifique de la méthode sera appelée. En général, cependant, il existe certains cas où la signature de la méthode peut être ambigu. Considérez les points suivants:

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...");
    }
}

Dans ce cas, le compilateur ne peut pas décider entre la méthode qui prend un Entier et la méthode qui prend une Chaîne de caractères. Lorsque j'essaie de compiler ce que j'arrive

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

9voto

ChssPly76 Points 53452

Ni. Vous obtiendrez une erreur de compilation, vous demandant de préciser quelle méthode vous voulez l'appeler. Vous pouvez le faire en faisant explicitement le casting du premier argument:

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

ou

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

Mise à jour je devrais avoir connu - ne doutez jamais de Jon Skeet. Le problème que j'ai évoqué ci-dessus se produit uniquement lorsqu'il est impossible de déterminer quelle méthode est la plus précise. Voici un cas de test:

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);
  }
}

Le ci-dessus donnera une erreur du compilateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X