7
votes

Fonction d'argumentation variable AMBIGUITY

   public static void main(String[] args) {
       System.out.println(fun(2,3,4));
     }
   static int fun(int a,int b,int c)
   {
     return 1;
   }
   static int fun(int ... a)
   {
     return 0;  
   }
Output:
1Question:
In the above case why does the function fun select the 1st function and not the second.On what basis is the selection done since there is no way to determine which fun the user actually wanted to call ?

0 commentaires

4 Réponses :


9
votes

Fondamentalement, il y a une préférence pour un appel spécifique. Outre toute autre chose, cela signifie qu'il est possible d'optimiser pour un petit nombre d'arguments, évitant de créer une matrice inutile à l'heure d'exécution.

Les JLS ne font pas cela très clair, mais c'est dans SECTION 15.12.2.5 , la partie qui parle d'une méthode d'arité fixe étant plus spécifique qu'une autre méthode si certaines conditions sont tenues - et elles font dans ce cas. Fondamentalement, il est plus spécifique car il y a plus d'appels que serait valable pour la méthode Varargs, tout comme s'il y avait le même nombre de paramètres, mais les types de paramètres eux-mêmes étaient plus généraux.


0 commentaires

3
votes

compilateur sélectionne toujours la méthode précise lorsque ces types d'ambiguïtés sont rencontrés. Dans votre scénario Func avec trois arguments est plus précis que les arguments variables que l'on appelle ainsi.

EDIT: édité selon le commentaire de Skeet.


1 commentaires

Ce n'est pas le JVM qui décide cela - c'est le compilateur.



2
votes

Si vous testez ces expressions: xxx

La sortie est xxx

Le compilateur Java vérifie d'abord pour une méthode dont la déclaration correspond au Paramètres exacts de l'invocation, et autrement, il recherche la correspondance de la méthode alternative.


0 commentaires

0
votes

Ce comportement permet la résolution de deux appels d'arguments variables surchargés:

addStates(){
   addStates(new String[0]);
}


0 commentaires