Quelle surcharge sera sélectionnée pour null en Java?

Si j’écris cette ligne en Java:

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

Quelle méthode sera appelée?

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

Je peux le tester. Mais dans d’autres cas similaires, je veux savoir ce qui se passe.

La méthode la plus spécifique sera appelée – dans ce cas

 showInputDialog(Component parent, Object message) 

Cela relève généralement de l’étape “Déterminer la signature de méthode” de la résolution de surcharge dans la spécification (15.12.2), et en particulier “Choisir la méthode la plus spécifique” .

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

Si plusieurs méthodes membres sont à la fois accessibles et applicables à une invocation de méthode, il est nécessaire d’en choisir une pour fournir le descripteur de la dissortingbution de la méthode d’exécution. Le langage de programmation Java utilise la règle selon laquelle la méthode la plus spécifique est choisie.

L’intuition informelle est qu’une méthode est plus spécifique qu’une autre si une invocation gérée par la première méthode pouvait être transmise à l’autre sans erreur de type à la compilation.

Dans votre cas particulier, la méthode plus spécifique sera appelée. En général, cependant, il existe des cas où la signature de la méthode peut être ambiguë. Considérer ce qui suit:

 public class Main { public static void main(Ssortingng[] 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( Ssortingng s ) { System.out.println("A Ssortingng 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. Quand j’essaie de comstackr ça, je reçois

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

Ni. Vous obtiendrez une erreur de compilation vous demandant de préciser quelle méthode vous souhaitez appeler. Vous pouvez le faire en lançant explicitement le premier argument:

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

ou

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

Mise à jour J’aurais dû savoir – ne doutez jamais de Jon Skeet. Le problème que j’ai mentionné ci-dessus ne se produit que lorsqu’il est impossible de déterminer quelle méthode est la plus spécifique. Voici un cas de test:

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

Ce qui précède donnera une erreur de compilation.