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

avec Java Discussion :

wildcard ou <E> quel differences


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 41
    Points : 40
    Points
    40
    Par défaut wildcard ou <E> quel differences
    Bonjour, je ne vois pas bien quand utiliser plutôt les wildcards ou les bounded wildcard plutôt que la notation générique.

    SI j'ai une liste de légumes je range dedans des choux des navets et du riz je la créée List< ? extends légumes>

    par contre quand j'accède à un de ces légumes ca oblige des castDonc si dans la majorité je nutilise les fonctions de légume que pour un légume à la fois là je dois plutôt déclarer légume<T> et l'intancier avec le légume dont je vais avoir besoin. Mais dans le cas d'une liste où je veux tout mélanger je suis bien obligé de garder ma wildcard?

    la notation <E> c'est plutôt dans la classe elle-même pour l'appliquer à plein de classe différentes?

    merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par xander412 Voir le message
    SI j'ai une liste de légumes je range dedans des choux des navets et du riz je la créée List< ? extends légumes>

    par contre quand j'accède à un de ces légumes ca oblige des castDonc si dans la majorité je nutilise les fonctions de légume que pour un légume à la fois là je dois plutôt déclarer légume<T> et l'intancier avec le légume dont je vais avoir besoin.
    C'est le principe, oui.

    Mais dans le cas d'une liste où je veux tout mélanger je suis bien obligé de garder ma wildcard?
    En fait, dans les cas simples, tu peux aussi bien faire List<Légume>. Pas besoin de s'embêter a priori avec un wildcard. Ce besoin peut apparaître dans des cas plus complexes où on obtient une List d'on ne sait pas trop quoi, mais en tout cas de quelque chose qui est Légume ou qui étend Légume.

    la notation <E> c'est plutôt dans la classe elle-même pour l'appliquer à plein de classe différentes?
    Oui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class ArrayList<E> {
     
      public boolean add(E e) {
        //
      }
     
      public E get(int index) {
        //
      }
    }
     
    public interface Comparator<E> {
      int compare(E e1, E e2):
    }
    Une List peut contenir tout ce qu'on l'a créée pour contenir. Un Comparator peut comparer tout ce qu'on l'a programmé pour comparer.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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,


    Si tu utilises un wildcard et que tu castes derrière, cela signifie que tu as un gros problème de conception...

    Les wildcards sont à utiliser lorsque tu peux utiliser un type plus abstrait, afin d'écrire une méthode plus générique et sans typage fort.

    Par exemple imaginons que la classe Legume possède une méthode getPoids() qui retourne le poids d'un légume.
    Pour calculer le poids total d'une liste de légume, on serait tenter d'écrire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static double calculPoids(List<Legume> list) {
        double total = 0.0;
        for (Legume legume : list) 
            total += legume.getPoids();
        return total;
    }
    C'est tout con mais tu ne peux utiliser cette méthode qu'avec une List<Legume>. Si tu veux calculer le poids total d'une List<Choux>, d'une List<Riz> ou autre tu devras réécrire la méthode avec le type précis car c'est incompatible.


    Les wildcards permettent de palier à cela, en limitant les fonctions possibles sur l'éléments.

    Donc la méthode devient ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public static <L extends Legume> double calculPoids(List<L> list) {
        double total = 0.0;
        for (L legume : list) 
            total += legume.getPoids();
        return total;
    }
    Désormais tu pourras utiliser la méthode avec n'importe quelle liste de légumes...



    a++

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/05/2009, 16h08
  2. quel est la difference ?
    Par yan dans le forum C++
    Réponses: 10
    Dernier message: 22/06/2007, 17h02
  3. Quel est la différence entre SUSE et mandrake
    Par pierrot10 dans le forum Distributions
    Réponses: 9
    Dernier message: 04/06/2006, 19h01
  4. Quel différence entre Linux et Unix ?
    Par hamadibensassi dans le forum Distributions
    Réponses: 5
    Dernier message: 31/05/2006, 23h18
  5. [SQLServer 2005][Oracle]Quels sont les differences de coût ?
    Par Débéa dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 15/12/2005, 07h54

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