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 :

Question sur la généricité !


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Question sur la généricité !
    Bonjour à tous !

    Voilà, j'ai une fonction qui doit retourner le minimum d'une liste qui peut contenir à la fois des entiers, des doubles, etc.
    Le problème est que lors de l'utilisation de cette méthode pour une liste d'entiers, il me dit que : min = (listeNote.getNote(i)) attend un double en retour (normal min est de type double).

    Ma question est : de quel type déclarer min, sachant que je peux utiliser des listes de nombres différents (int, double, etc.) ?
    C'est un problème non seulement pour cette méthode, mais aussi pour moi car je n'arrive pas à saisir comment je pourrais résoudre ce problème dans d'autres situations.

    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static double getMinimum(ListeNotes<? extends Number> listeNote) {
     
            double min = listeNote.getNote(1).doubleValue();
            for (int i = 1; i < listeNote.getNbNotes() + 1; i++) {
                if (listeNote.getNote(i).doubleValue() <= min) {
                    min = (listeNote.getNote(i);
                }
            }
            return min;
        }

    Merci à tous ceux qui voudront bien m'éclaircir

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 380
    Points : 480
    Points
    480
    Par défaut
    Bonjour,

    Je pense que tu peux simplement faire comme dans le test du if, c'est à dire utiliser la méthode doubleValue()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    min = listeNote.getNote(i).doubleValue();
    J'espère avoir pu t'aider,

    A+

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2010
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Effectivement ça marche, j'aurais du le voir plus tôt

    Merci à toi !

  4. #4
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    bonjour,

    Quel est l'interet d'utiliser les génériques si tu attend un double ?

    Il serait plus logique de prendre en paramètre une liste ListeNotes<Double> !
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    ce n'est pas cela que tu cherche a faire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public Number getMin(List<Number> listeNote){
            Number min = listeNote.get(0);
            for(Number n : listeNote){
                if(n.doubleValue() < min.doubleValue()){
                    min = n;
                }
            }
     
            return min;
        }

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

    Les Generics permettent ici d'utiliser la méthode avec n'importe quel type de liste.


    @rolfone : Ton code a l'avantage de renvoyer l'objet réel dans son vrai type, et non pas une copie de la valeur. Toutefois il y a deux problème avec ton code :
    • Il génère un IndexOutOfBoundsException si la liste est vide (mais c'est peut-être voulu).
    • Il est arbitrairement limité aux List<Number>. Impossible de l'utiliser avec une List<Integer>, List<Long>, List<Double> ou autre...


    La solution consiste à paramétrer la méthode avec les Generics et les wildcards :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public static <N extends Number> N min(List<N> list) {
    		N min = list.get(0); // IndexOutOfBoundsException if empty
    		for (N n : list) {
    			if (n.doubleValue() < min.doubleValue()) {
    				min = n;
    			}
    		}
    		return min;
    	}
    On peut désormais utiliser notre méthode avec plusieurs types de liste (List<Number>, List<Integer>, List<Double>, ...), et en plus le type de retour correspond au type déclaré de la liste.
    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	List<Integer> integers = Arrays.asList(1, 2, 3, 4);
    	Integer minInteger = min(integers);
     
    	List<Double> doubles = Arrays.asList(1.0, 2.0, 3.0, 4.0);
    	Double minDouble = min(doubles);
     
    	List<Number> numbers = Arrays.<Number>asList(1, 2, 3.0, 4.0);
    	Number minNumbers = min(numbers);





    Mais... Pourquoi s'embêter autant quand l'API standard propose déjà des outils pour cela, via les méthodes Collections.min() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	List<Integer> integers = Arrays.asList(1, 2, 3, 4);
    	Integer minInteger = Collections.min(integers);
     
    	List<Double> doubles = Arrays.asList(1.0, 2.0, 3.0, 4.0);
    	Double minDouble = Collections.min(doubles);
     
    	List<Number> numbers = Arrays.<Number>asList(1, 2, 3.0, 4.0);
    	// Ici on a besoin de spécifier un Comparator car Number n'est pas Comparable
    	Number minNumbers = Collections.min(numbers, new Comparator<Number>() {
    		@Override
    		public int compare(Number o1, Number o2) {
    			return Double.compare(o1.doubleValue(), o2.doubleValue());
    		}
    	});

    a++

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 342
    Points : 419
    Points
    419
    Par défaut
    Effectivement je n'est pas fait attention je n'est pas répondu a la question.

    je n'est pas fait attention au fait de pouvoir utiliser des List<Integer> List<Double>.

Discussions similaires

  1. Question sur la généricité et les Collections
    Par MrEddy dans le forum Général Java
    Réponses: 4
    Dernier message: 11/06/2010, 11h39
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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