2009-08-24 6 views
4

En section 15.12.2.5 of the Java Language Specification, il parle de la façon de choisir la méthode la plus spécifique dans les deux cas de méthodes avec arité fixe et les méthodes de arity variables (à savoir varargs). Ce que je ne peux pas trouver dans le JLS est quelque chose au sujet de décider entre deux méthodes où un est de l'arité fixe et un de l'arité variable cependant. Par exemple:La méthode la plus spécifique avec des allumettes à la fois arité fixes/variables (varargs)

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

Compile très bien comme on pouvait s'y attendre (pour les raisons exposées ci-dessous par Yoni). Ce code d'appel compile également:

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

et si vous l'exécutez, method #1 (à savoir la méthode non-varargs) est appelée. Pourquoi ce code d'appel n'est pas ambigu? Pourquoi la méthode de l'arité fixe est-elle plus spécifique que la méthode de l'arité variable? Quelqu'un peut-il me signaler le bit pertinent de la spécification?

+1

curieux ... avez-vous une raison particulière pour comprendre en plus d'un intérêt académique? (J'essaye d'implémenter la sélection d'expédition d'exécution + se demandait qui d'autre pourrait faire la même chose) –

Répondre

10

La première phase de résolution de méthode ne tient compte que des méthodes de arity fixes et le processus est terminé si une correspondance est trouvée, avant que toutes les méthodes varargs soient considérées.

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

15.12.2.2 Phase 1: Identifier correspondants Arity Méthodes applicables par sous-typage

Si aucune méthode applicable par le sous-typage se trouve, la recherche de méthodes applicables continue avec 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-typage.

(moi qui souligne.)

+0

Merci Alex - Je ne voyais pas le bois pour les arbres. Merde ces arbres! –

+1

Ces varargs sont maudits! – pjp

-1

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

getSomething(String...args) 

se traduit

getSomething(String[] args) 

sans ambiguïté

+0

Oui - je comprends cela. Je demandais pourquoi le code d'appel n'est pas ambigu - j'ai clarifié mon intention dans la question –

Questions connexes