Méthode la plus spécifique avec des correspondances d'arity fixe / variable (varargs)

StackOverflow https://stackoverflow.com/questions/1321657

  •  19-09-2019
  •  | 
  •  

Question

Dans Section 15.12.2.5 de la spécification de la langue Java, il explique comment choisir la méthode la plus spécifique dans les deux cas de méthodes avec une aité fixe et des méthodes d'arité variable (c'est-à-dire varargs).

Ce que je ne trouve pas dans le JLS, c'est quelque chose de décider entre deux méthodes où L'un est d'arité fixe et une Arité variable toutefois. Par exemple:

public interface SomeApi {
    public String getSomething(String arg);       // method 1
    public String getSomething(String ... args);  // method 2
}

Compile très bien comme on pourrait s'y attendre (Pour des raisons décrites par Yoni ci-dessous). Ce code d'appel compile également:

SomeApi api = ...
Object o = api.getSomething("Hello");

Et si vous l'exécutez, method #1 (c'est-à-dire que la méthode des non-varargs) est appelée. Pourquoi ce code d'appel n'est-il pas ambigu? Pourquoi la méthode d'arité fixe est-elle plus spécifique que celle de la variable-arity? Quelqu'un peut-il me diriger vers le morceau pertinent de la spécification?

Était-ce utile?

La solution

La première phase de résolution de la méthode ne considère que les méthodes d'arité fixes et le processus est terminé si une correspondance est trouvée, avant que toutes les méthodes VARARG ne soient prises en compte.

De http://docs.oracle.com/javase/specs/jls/se6/html/expressions.html#15.12.2.2

15.12.2.2 Phase 1: Identifier Atité assortie Méthodes applicables par sous-type

Si aucune méthode applicable par sous-type n'est trouvée, la recherche de méthodes applicables se poursuit avec la phase 2 (§15.12.2.3). Sinon, la méthode la plus spécifique (§15.12.2.5) est choisie parmi les méthodes applicables par sous-type.

(Mon accent.)

Autres conseils

Je ne peux pas vous indiquer la spécification, mais logiquement,

getSomething(String...args) 

Se traduit par

getSomething(String[] args)

sans ambiguïté

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top