Par exemple, une classe comprend deux méthodes,
public void find(Object id);
public void find(Object... ids);
Quand j'invoque trouver (null), pourquoi jvm exécuter effectivement la dernière?
En réponse acceptée de Calling Java varargs méthode avec l' argument null unique? on peut lire que
Java ne sait pas de quel type il est censé être. Il pourrait être un objet nul, ou il pourrait être un tableau d'objets null. Pour un seul argument , il suppose que le dernier « .
mais cela n'explique toujours pas. Quelqu'un peut-il fournir quelques informations comme de la spécification de langage?
Object[]
est plus type spécifique que Object
.
Selon JLS §15.12.2
Si plus d'une méthode membre est à la fois accessible et applicable à un appel de méthode, il est nécessaire de choisir un pour fournir le descripteur pour l'envoi 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 choisi.
L'intuition informelle est une méthode qui est plus spécifique que le cas échéant un autre invocation gérée par la première méthode peut être transmise à l'autre sans une erreur de compilation.
Le même chapitre a aussi un exemple exactement sur la situation en question.
[...] un procédé de arité variable est considérée comme une méthode d'arité fixe dans la première phase. Par exemple, déclarant m (Object ...) dans une classe qui déclare déjà m (Object) provoque m (Object) à ne plus être choisi pour certaines expressions d'invocation (tels que m (null)), comme m (Object [] ) est plus spécifique.