IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Overloading avec var args


Sujet :

Langage Java

  1. #1
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut Overloading avec var args
    Bonjour,

    J'ai lu sur JavaRanch le topic suivant:

    http://www.coderanch.com/t/501804/ja...ed-overloading

    ... et j'avoue que je ne comprends toujours pas l'explication de l'appel à la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     //methObject
    static void overloading(Object... o) {  
           System.out.println("Object Var-Args");  
        }
    (dans le contexte du post 1).

    Dans un des posts qui suivent, un intervenant dit:
    Object... method has argument type of Object[] and so it can be called with String[] without using variable arity invocation. Non varargs call is always preffered against varargs call so the Object... method will be used.
    Ce que je ne comprends pas est pourquoi "methObject" serait appelée "without using variable arity invocation".

    Je crois qu'il sous entend que la nuance vient du fait qu'une méthode ayant pour argument soit Object[] soit Object peut recevoir un paramètre de type String[] (qui est un tableau d'Objects mais aussi simplement un Object). Je suis d'accord sur ce point mais où cela mène t-il?

    Merci vivement de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    en "gros" ça viens des règles java pour trouver la méthode qui s'applique, et avec les var-arg, en très gros (j'ai pas envie de sortire les détail, c'est dans le java langage specification), c'est difficile, voir impossible dans l'état actuel du language, de faire de l'overloading sur des méthodes à argument variable*.

    Donc tu aura des problèmes avec

    public void meth(Object[].... argument)
    public void meth(String[].... argument)
    public void meth(Object.... argument)


    conclusion, pour les méthodes surchargée, éviter d'en avoir plusieurs avec argument variable, le choix n'est pas toujours aussi instinctif qu'on le voudrait


    * j'entends par là faire de l"overloading en ayant un choix naturel des méthodes ad-hoc, le compilo luin il suit la logique du language, mais sur les opérateurs surchargé ça amène des trucs qui ont pas l'air naturels.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    En cas de surcharge de méthode, le compilateur va rechercher la méthode la plus adapté selon le type de ses paramètres, ou générer une erreur si il trouve une ambiguïté.

    Toutefois l'expansion des varargs survient après une première recherche. En effet les varargs sont en fait des tableaux (pour des raisons de compatibilités entre autres), donc lorsque tu as ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void overloading(String[]... s)
    void overloading(Object... o)
    En réalité tu as ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void overloading(String[][] s)
    void overloading(Object[] o)

    Du coup lorsque tu fais appel à cette méthode avec un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             String[] aa = new String[2];  
             overloading(aa);
    Le compilateur va ignorer la première méthode (String[] n'est pas compatible avec String[][]), alors que la seconde est correcte (String[] est compatible avec Object[]).

    La décomposition en varargs n'est faite qu'après si aucune méthode "standard" ne correspond à notre appel, ce qui n'est pas le cas ici.


    a++

    PS : Tout ceci c'est surtout pour le principe : il vaut mieux éviter toutes surcharges qui pourrait apporter des ambiguïtés comme cela... varargs ou pas

  4. #4
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Bonjour,

    Merci à vous deux pour vos réponses

    Je ne mets pas le sujet résolu au cas où certains auraient des explications complémentaires.
    J'espère qu'il n'y aura pas de questions de ce genre pour l'exam de la SCJP

  5. #5
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Re bonjour

    Toutefois l'expansion des varargs survient après une première recherche. En effet les varargs sont en fait des tableaux [...]

    En réalité tu as ceci :
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void overloading(String[][] s)
    void overloading(Object[] o)
    Ok, les var-args pouvent être imaginés comme des tableaux (éventuellement vide).

    D'après ce qui a été dit, après "extension des var args", un paramètre de type String[] correspondra avec l'argument de type Object[] et non String[][] ce qui est logique.

    Et c'est peut être aussi pour cela qu'un des intervenants indique que la méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //methode écrite par le développeur:
    void overloading(Object o)
    correspondra à un appel "without using variable arity invocation", raison pour laquelle elle est appelée. En effet, après expansion des var arg, on a la méthode "généree"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void overloading(Object[] o)
    que la JVM appelle en passant un (exactement un) String[] d'où la non arité évoquée. Tandis que si, c'est l'autre méthode qui est appelée , on aurait éventuellement un [][]String vide (si la JVM avait appelé la méthode sans aucun paramètre) d'où la notion d'arité qui apparait.

    Au final l'appel sans arité est privilégié.

    Mes questions maintenant sont:
    1) Ma compréhension de la chose vous parait-elle juste?

    2) J'ai l'impression que cet overloading non trivial est spécifique au fait qu'on passe un tableau et vous?

    Merci d'avance encore une fois

  6. #6
    Expert confirmé

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Points : 4 324
    Points
    4 324
    Par défaut
    Le var args *sont* véritablement des tableau, et ils sont transformés à à la compilation. Un petit article qui pourra t'aider (en anglais par contre) : http://alaindefrance.wordpress.com/2...pilation-time/
    http://alaindefrance.wordpress.com
    Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
    SDE at BitTitan

  7. #7
    Membre actif Avatar de Roy Miro
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    273
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 273
    Points : 290
    Points
    290
    Par défaut
    Le var args *sont* véritablement des tableau, et ils sont transformés à à la compilation.
    Bonjour,

    Merci pour l'article (très clair par ailleurs)

    Grâce à vos réponses, les choses paraissent plus évidentes maintenant.
    Donc les var args c'est piegeux avec les tableaux. Y a-t-il d'autre types d'objets qui soulèvent des questions de ce type?

    Merci encore et bonne soirée!

Discussions similaires

  1. [PDO] Pdo : bind update avec :var et ? ( ordre d'exécution)
    Par Valkirion dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 19/03/2012, 17h53
  2. suppression d'une variable declare avec var
    Par the-destroyer dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 28/05/2011, 13h51
  3. Formulaire d'authentification avec var de sessions
    Par niamo dans le forum ASP.NET
    Réponses: 12
    Dernier message: 27/09/2010, 17h26
  4. function avec Var
    Par tintin62 dans le forum Débuter
    Réponses: 3
    Dernier message: 21/08/2010, 00h47
  5. [SQL] Supprimer espace avec .$var.
    Par wolflinger dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 17/05/2006, 11h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo