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 :

Méthode avec plusieurs types de retour


Sujet :

Langage Java

  1. #1
    Membre régulier Avatar de baya1
    Inscrit en
    Février 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 112
    Points : 89
    Points
    89
    Par défaut Méthode avec plusieurs types de retour
    Salut tout le monde,
    J’aimerai savoir s’il existe un moyen pour qu’une méthode me retourne plusieurs types à la fois ? J’aimerai faire ça pour le problème suivant :

    Je manipule plusieurs types de données : des float, int, etc. et dans ma méthode j’aimerai faire la conversion d’une chaîne selon le type entré par l’utilisateur (donc le type est imprévisible au départ), et donc le résultat sera en fonction du type entré.
    Par exemple :
    si je précise en entrée que ma chaîne doit être convertie en int, le résultat doit être un int. Si je précise en entrée que ma chaîne doit être convertie en float, le résultat doit être un float.
    Comment doit je faire cela ? Si on peut créer une méthode avec plusieurs types de retour ça serait le top.
    Merci d’avance pour votre aide.

  2. #2
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    On ne peut pas .... mais tu peux renvoyer un Object. Par contre tu va avoir des Integer à la place des int ...

    ensuite avec un getClass dans la méthode appelante tu récupères le type réel de l'objet ... et tu cast. Ce n'est pas génial mais ça devrait fonctionner.

    Il y a peut être plus propre (surement). Mais bon je propose toujours ...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 64
    Points : 58
    Points
    58
    Par défaut
    Tu peux retourner en sortie ce que tu veux, un entier, un float, etc... tous ces objets dérivent de la même classe : Object. Le type de retour de ta méthode sera donc Object, attention toutefois de bien tester le type d'objet reçu apres appel de ta méthode, sous peine d'avoir des exceptions.

    [edit] Mon message fait un peu doublon on m'a devancé de peu ^^

  4. #4
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    Citation Envoyé par Crowell
    Tu peux retourner en sortie ce que tu veux, un entier, un float, etc... tous ces objets dérivent de la même classe : Object.
    Petite remarque :
    les primitives telles que int, float, boolean etc ... ne sont pas des objets.
    Pour utiliser ces types de primitives il faut utiliser les classes correspondantes Integer, Float, Double etc ...

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Points : 446
    Points
    446
    Par défaut
    Citation Envoyé par baya1
    si je précise en entrée que ma chaîne doit être convertie en int, le résultat doit être un int. Si je précise en entrée que ma chaîne doit être convertie en float, le résultat doit être un float.
    Dans ce cas là, pourquoi ne pas faire plusieurs méthodes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public int parseInt(String s)
    public float parseFloat(String s)
    ...
    D'autant que ces méthode là existent déjà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Integer.parseInt(String s)
    ...
    Sinon, une méthode ne peut avoir qu'un seul type de retour. Il te faut retourner l'ancètre commun de tes différents types et de faire un cast. Mais ce n'est pas top.

    [Edit] J'oubliais, en Java 1.5, tu as l'autoBoxing qui te permet d'utiliser indiffemment (ou presque) un type primitif ou sa classe wrapper.

  6. #6
    Membre régulier Avatar de baya1
    Inscrit en
    Février 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 112
    Points : 89
    Points
    89
    Par défaut
    Merci beaucoup pour toutes vos réponses, je vais essayé toutes ces solutions et je vous rendrai les réponses.

  7. #7
    Membre régulier Avatar de baya1
    Inscrit en
    Février 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 112
    Points : 89
    Points
    89
    Par défaut
    salut,
    j'ai essayé un peu de tout, mais je n'y arrive pas.
    je n'ai pas compris la phrase de in:
    ensuite avec un getClass dans la méthode appelante tu récupères le type réel de l'objet ... et tu cast. Ce n'est pas génial mais ça devrait fonctionner.
    aidez moi SVP.

  8. #8
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    En fait j'ai pas trop compris ce que tu désirais faire.
    Tu veux créer une méthode qui prend en entrée un type et une chaîne, et qui en sortie renvoit cette chaîne dans le type donné en entrée ?

    Peux tu m'en donner l'intérêt ?
    Si ce n'est pas ça donne moi un exemple parce que là je suis perdu dans la vase.

  9. #9
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    ben il faudrait que tu sois plus précis quant à ce que tu veux faire ...

    je te propose un exemple qui est bancal. Il y a surement une facon de faire plus propre, en particulier ne te basant sur la reflexion et sur la classe Class ...

    enfin si ça peut t'aider tant mieux ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    /** méthode qui retourne un type d'objet différent suivant les paramètres
             */
    	public static Object maMethode(...){
     
    		Object result = null;
     
    		// donc pleins de super traitements
    		// crée une instance du type demandé
    		result = "abcd"; //String
    		result = 10;	 // integer
    		result = 10D;	 // double
    		result = new megaObjectdeOuf();
    		// ...
    		return result;
    	}
     
     
    	/** méthode appelante */
    	public static void main(String[] args){
     
    	      Object monObjet  = maMethode(...);
    	      Class leType = monObjet.getClass();
    	      System.out.println("Y'e soui oune object dé type : " + leType.getName());
     
    	      // bon après je sais pas trop qu'est ce qui est le plus propre
    	      // tu devrais regarder du coté de la reflexion et de la classe Class
    	      //
    	      // par exemple (à ne pas faire je pense ;-) ):
    	      if("Integer".equals(leType.getName())){
    	    	  // je suis un int
    	    	  int monObjetTypé = (Integer) monObjet;
    	      }
     
    	}

  10. #10
    Membre expérimenté Avatar de willoi
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    1 355
    Détails du profil
    Informations personnelles :
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 355
    Points : 1 639
    Points
    1 639
    Par défaut
    et je me demandais avec instanceof ca serait pas plus simple ?

  11. #11
    in
    in est déconnecté
    Membre expérimenté Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Points : 1 718
    Points
    1 718
    Par défaut
    Citation Envoyé par willoi
    et je me demandais avec instanceof ca serait pas plus simple ?
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if("Integer".equals(leType.getName()))
    oui surement. La c'était juste pour montrer le getClass ...

    donc pour tester le type tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(monObjet.getClass().isAssignableFrom(Integer.class))
    // ou
    if(monObjet instanceof Integer)

    A mon avis ya encore plus propre. J'avais essayé de faire un truc générique au début mais je m'en sortais pas vraiment. Faudrait un peu plus se plonger dedans ...

  12. #12
    Membre régulier Avatar de baya1
    Inscrit en
    Février 2007
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 112
    Points : 89
    Points
    89
    Par défaut
    Salut,
    Tu veux créer une méthode qui prend en entrée un type et une chaîne, et qui en sortie renvoit cette chaîne dans le type donné en entrée ?
    Oui c'est exactement ça. et pour
    Peux tu m'en donner l'intérêt ?
    l'interet c'est que je vais appliquer cette méthode sur deux valeurs dont je ne connais pas le type au départ. donc je crée cette méthode, je l'applique aux deux valeurs(qui sont des chaînes au départ), et après leur conversion avec cette méthode je les compare pour voir quelle est la valeur qui est superieur à l'autre.
    pour faire cette comparaison il me faut absolument convertir les daux valeurs vers leur type, et comme ces valeurs peuvent être de n'importe quel type, je veux créer une méthode qui convertisse ces valeurs selon le type entré par l'utilisateur. j'espère que c'est clair comme ça.
    en tout cas je vous remercie beaucoup pour vos réponses, et je vais encore essayé tout ce que vous avez propsé.

  13. #13
    Futur Membre du Club
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    ok... tu veux faire des comparaisons de réels (entiers, flottants...) ou d'autres types ?

    Si tu veux juste t'assurer que les chaînes en entrée soient des réels tu peux toujours faire :

    try{
    double d = Double.parseDouble(chaine);
    return d;
    }
    catch(Exception e)
    {
    System.err.println("C'est pas un reel");
    }

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Mars 2022
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Mars 2022
    Messages : 1
    Points : 1
    Points
    1
    Par défaut OUI Mais je ne suis qu'étudiant ;) je ne sais pas si ça ce fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    public class PlatFactory {
     
        boolean poisson = true;
        boolean viande = true;
        boolean volaille = true;
     
        public PlatFactory() {
     
        }
     
        public Poisson getPoisson(String plat) {
     
            if (plat.equalsIgnoreCase("Saumon")) {
                return new Poisson();
            }
            else if (poisson == false) {
                return null;
            }
            else {
                System.out.println("Il n'y a plus de " + plat + ".");
                poisson = false;
                getViande(plat);
                return null;
            }
        }
     
        public Viande getViande(String plat) {
     
            if (plat.equalsIgnoreCase("Veau")) { 
                return new Viande();
            }
            else if (viande == false) {
                return null;
            }
            else {
                System.out.println("Il n'y a plus de " + plat + ".");
                viande = false;
                getVolaille(plat);
                return null;
            }
        }
     
        public Volaille getVolaille(String plat) {
     
            if (plat.equalsIgnoreCase("Dinde")) {
                return new Volaille();
            }
            else if (volaille == false) {
                return null;
            }
            else {
                System.out.println("Il n'y a plus de " + plat + ".");
                volaille = false;
                getPoisson(plat);
                return null;
            }
        }
    }

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par Pepin6 Voir le message
    Je ne sais pas si ça se fait
    Non, ça ne sert à rien du tout ce que tu nous montres là, et ça ne résout pas le problème.

    (et c'est un peu pareil pour fredix_noob, mais lui c'était il y a 15 ans.)

Discussions similaires

  1. Réponses: 10
    Dernier message: 28/08/2013, 21h57
  2. Travailler avec une méthode ayant plusieurs types de retour
    Par fafoula dans le forum Général Java
    Réponses: 4
    Dernier message: 27/07/2012, 11h23
  3. Réponses: 3
    Dernier message: 01/02/2010, 16h54
  4. "Tableau" avec plusieurs types de variables
    Par izguit dans le forum C++
    Réponses: 4
    Dernier message: 19/07/2007, 12h24
  5. Réponses: 5
    Dernier message: 07/06/2007, 18h47

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