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

Collection et Stream Java Discussion :

[Debutant]Méthode, liste de paramètres et un tableau


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 50
    Points
    50
    Par défaut [Debutant]Méthode, liste de paramètres et un tableau
    Bonjour à tous,

    Je rencontre un problème de syntaxe java.
    J'ai la méthode suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void maMethode(Object... p){
     Object[] params = p;
     ... 
    }
    Lorsque j'appelle cette méthode des manières suivantes, je n'ai pas de souci, je récupere bien un tableau d'objet, chacun contenant dans la ième case, le ième objet passé en paramètre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     // Récuperation de 4 objets distincts
     maMethode(1,2,"a","b");
     // ou Récuperation de 2 tableaux distincts
     maMethode(int[]{1,2}, String[]{"a","b"});
    Mais quand je fais l'appel suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     maMethode(int[]{1,2,3,4});
    Au lieu que l'objet params (dans ma méthode maMethode) soit un tableau de taille 1 avec un tableau de taille 4 dans la première case, je me retrouve avec un tableau de taille 4, chaque case contenant une valeur du tableu passé en paramètre. Et ca m'embête bien!
    Je veux pouvoir garder la liberté donné par la declaration sans perdre d'informations lorsque je rentre un tableau de valeurs, mais je n'y parviens pas.
    Quelqu'un a une réponse à me donner?

    Merci d'avance
    Je m'en fous, je suis fou!

  2. #2
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Points : 379
    Points
    379
    Par défaut
    Salut.
    C'est parsque la syntaxe "..." veut dire "nombre d'arguments variables mais considère que les arguments passés le sont dans un tableau, dans ton cas comme tu ne donne qu'un tableau le compilateur considère qu'il s'agit de la liste des arguments et non du tableau lui même, si tu veux explicitement un tableau tu dois le déclarer dans l'entête de ta méthode, mais si tu débute tu ne devrais pas commencer par les fonctions attendant un nombre d'argument variable en paramètre car c'est surtout une facilité d'écriture qui est apparue avec Java 6.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Merci.
    Ok, je vais forcer la création d'un tableau, bien que je trouve la solution des varargs bien plus jolie et permissive.
    (et je ne trouve pas ca logique qu'alors que je lui passe un seul paramètre (même s'il s'agit d'un tableau) il ne le garde pas comme un tableau de tableau).
    Je m'en fous, je suis fou!

  4. #4
    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,

    Citation Envoyé par soft0613 Voir le message
    C'est parsque la syntaxe "..." veut dire "nombre d'arguments variables mais considère que les arguments passés le sont dans un tableau, dans ton cas comme tu ne donne qu'un tableau le compilateur considère qu'il s'agit de la liste des arguments et non du tableau lui même
    C'est tout à fait cà !
    La signature maMethode(Object...) est strictement équivalente à maMethode(Object[] p), si ce n'est que le compilateur gèrera automatiquement les appels avec plusieurs paramètres.

    Du coup la méthode peut être traité comme une méthode à paramètre variable ou bien une méthode attendant un tableau.



    Théoriquement avec Object... et int[] tu ne devrais pas avoir de problème. Je suppose que tu dois utiliser un autre type de tableau en réalité (comme Integer[]).


    Dans ce cas le problème vient de l'héritage particulier des tableaux. En effet Integer[] hérite de Object[] donc lorsque tu appelles
    maMethode(a) avec a de type Integer[] le compilateur se trouve devant une ambigüité :
    1. Il peut appeler directement maMethode(Object[]) et donc lui passer le tableau tel quel.
    2. Ou alors généré une liste de paramètres et donc créer un tableau contenant les paramètres.


    Le compilateur choisit la première option (pour compatibilité avec les codes existants), mais il te génère un warning qui indique la solution.

    Il suffit de caster le paramètre vers le type voulu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	// Pour traiter le tableau comme un paramètre standard,
    	// Il faut le caster vers le type de base (Object donc) :
    	// La méthode recevra donc 1 paramètre variable de type Integer[]
    	maMethode( (Object) new Integer[]{1,2} );
     
    	// Pour traiter le tableau comme la liste des paramètres sans warning,
    	// Il faut le caster vers le type du tableau généré (Object[] donc) :
    	// La méthode recevra donc 2 paramètre variable de type Integer
    	maMethode( (Object[]) new Integer[]{1,2} );

    Citation Envoyé par soft0613 Voir le message
    mais si tu débute tu ne devrais pas commencer par les fonctions attendant un nombre d'argument variable en paramètre car c'est surtout une facilité d'écriture qui est apparue avec Java 6.
    Débutant ou non : je ne vois pas de raison de s'en passer si cela correspond bien au besoin...

    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Merci, je m'étais naturellement tourné vers la solution du casting.
    Je passe le sujet en résolu.
    Merci à vous 2.
    Je m'en fous, je suis fou!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 31/10/2014, 14h29
  2. Méthode avec un paramètre de type "object" : comment lui passer une List ?
    Par Picsonald dans le forum Windows Communication Foundation
    Réponses: 22
    Dernier message: 19/03/2012, 10h16
  3. [Debutant] Méthodes numériques
    Par griffu01 dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 24/05/2004, 21h21
  4. [Debutant(e)] Liste raccourcis clavier
    Par lfournial dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 11/05/2004, 14h51
  5. Comment obtenir la liste des paramètres d'une SP ?
    Par Le Gritche dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 14/03/2003, 16h54

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