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 :

Génériques sur JAVA


Sujet :

avec Java

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    810
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 810
    Points : 228
    Points
    228
    Par défaut Génériques sur JAVA
    Bsr à tous,
    J'ai une question sur les classes génériques qui d'après ce que j'ai lu sur un support de cours :
    "Lorsque vous utilisez un type générique, vous le paramétrez avec un type de données. Ceci permet au code de s’adapter automatiquement et de réaliser la même action indépendamment du type de données."
    Voici la classe générique en question :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    package Cours;
     
    import java.util.ArrayList; 
    public class ListeGenerique <T> 
    { 
        // pour stocker les éléments de la liste 
        private ArrayList<T> liste; 
        // pointeur de position dans la liste 
        private int position; 
        // nombre d’éléments de la liste 
        private int nbElements; 
        // constructeur avec un paramètre permettant de dimensionner 
        // la liste 
        public ListeGenerique(int taille) 
        { 
         liste=new ArrayList<T>(taille); 
        } 
        public void ajout(T element) 
        { 
                liste.add(element); 
                nbElements = nbElements + 1; 
        } 
       public void insert(T element,int index) 
        { 
            // on vérifie si l’index n’est pas supérieur au nombre 
            // d’éléments ou si l’index n’est pas inférieur à 0 
            if (index >= nbElements || index < 0) 
            { 
               return; 
            } 
            liste.add(index,element); 
            // on met à jour le nombre d’éléments 
            nbElements = nbElements + 1; 
        } 
       public void remplace(T element,int index) 
       { 
           // on vérifie si l’index n’est pas supérieur au nombre 
           // d’éléments ou si l’index n’est pas inférieur à 0 
           if (index >= nbElements || index < 0) 
           { 
              return; 
           } 
           liste.set(index,element); 
       } 
       public void supprime(int index) 
       { 
           int i; 
           // on vérifie si l’index n’est pas supérieur au nombre 
           // d’éléments ou si l’index n’est pas inférieur à 0 
           if (index >= nbElements || index < 0) 
           { 
              return; 
           } 
           liste.remove(index); 
           // on met à jour le nombre d’éléments 
           nbElements = nbElements - 1; 
       } 
       public T getElement(int j)  
       { 
          return liste.get(j); 
       } 
       public int getNbElements() 
       { 
           return nbElements; 
       } 
       public T premier() throws Exception 
       { 
           if (nbElements == 0) 
           { 
               throw new Exception("liste vide"); 
           } 
           // on déplace le pointeur sur le premier élément 
           position = 0; 
           return liste.get(0); 
       } 
       public T dernier() throws Exception 
       { 
           if (nbElements == 0) 
           { 
               throw new Exception("liste vide"); 
           } 
           // on déplace le pointeur sur le dernier élément 
           position = nbElements - 1; 
           return liste.get(position); 
       } 
       public T suivant() throws Exception 
       { 
           if (nbElements == 0) 
           { 
               throw new Exception("liste vide"); 
           } 
           // on vérifie si on n’est pas à la fin de la liste 
           if (position == nbElements - 1) 
           { 
               throw new Exception("pas d’element suivant"); 
           } 
           // on déplace le pointeur sur l’élément suivant 
           position = position + 1; 
           return liste.get(position); 
       } 
       public T precedent() throws Exception 
       { 
           if (nbElements == 0) 
           { 
               throw new Exception("liste vide"); 
           } 
           // on vérifie si on n’est pas sur le premier élément 
           if (position == 0) 
           { 
               throw new Exception("pas d’élément précédent"); 
           } 
           // on se déplace sur l’élément précédent 
           position = position - 1; 
           return liste.get(position); 
       } 
    }
    et la petite appli pour l'utiliser :
    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
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    package Cours;
     
    import java.io.BufferedReader; 
    import java.io.InputStreamReader;
    import java.time.LocalDate; 
    public class TestListeGenerique 
    { 
          static ListeGenerique<String> liste = new 
    ListeGenerique<String>(5); 
     
          public static void main(String[] args) 
          { 
                 liste.ajout("premier"); 
                 liste.ajout("deuxième"); 
                 liste.ajout("troisième"); 
                 liste.ajout("quatrième"); 
                 liste.ajout("cinquième"); 
                 menu(); 
             } 
          public static void menu() 
          { 
            char choix='\0'; 
            System.out.println("p (premier)");
            System.out.println("< (précédent)");
            System.out.println("> (suivant)");
            System.out.println("d (dernier)");
            System.out.println("f (fin)");
     
     
            while (choix != 'f') 
            { 
                try 
                { 
                    BufferedReader br; 
                       br=new BufferedReader(new 
    InputStreamReader(System.in)); 
                       choix=br.readLine().charAt(0); 
                       switch (choix) 
                       { 
                       case 'p': 
                            System.out.println("le premier " +  
    liste.premier()); 
                            break; 
                       case '<': 
                            System.out.println("le précédent " +  
    liste.precedent()); 
                            break; 
                       case '>': 
                           System.out.println("le suivant " + liste.suivant()); 
                       break; 
                  case 'd': 
                       System.out.println("le dernier " +  
    liste.dernier()); 
                       break; 
               } 
           } 
           catch (Exception e) 
           { 
               System.out.println(e.getMessage()); 
           } 
                System.out.println("p (premier)");
                System.out.println("< (précédent)");
                System.out.println("< (suivant)");
                System.out.println("d (dernier)");
                System.out.println("f (fin)");
     
    /* System.out.println("p (premier) < (précédent) >(suivant) d  
    (dernier) f (fin)"); */
     } 
     
    } 
    }
    Ceci fonctionne très bien, cependant si je veux l'utiliser avec un autre type de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     liste.ajout(new Personne("toto2GENERIC","prenom2",LocalDate.of(1922,2,15)));
    j'ai l'erreur suivante : "The method ajout(String) in the type ListeGenerique<String> is not applicable for the arguments (Personne)"
    En déclarant une autre liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static ListeGenerique<Personne> liste2 = new 
        		  ListeGenerique<>(5);
    ca marche, mais cela me semble curieux car ça ne correspond pas aux dires du cours, si quelqu'un a une idée Merci

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

    Tout l'intérêt des Generics est là : ton code est générique mais le typeage est fort : tu ne peux pas mettre un objet Person dans une liste de String...

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Hello,

    Citation Envoyé par xeron33 Voir le message
    ca marche, mais cela me semble curieux car ça ne correspond pas aux dires du cours,
    tu peux nous en dire un peu plus à ce sujet ? Je ne vois pas où ça ne correspond pas.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    810
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 810
    Points : 228
    Points
    228
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,

    Tout l'intérêt des Generics est là : ton code est générique mais le typeage est fort : tu ne peux pas mettre un objet Person dans une liste de String...
    **********************Merci pour t a réponse que veux tu dire par "le typage est fort" ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    810
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 810
    Points : 228
    Points
    228
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Hello,



    tu peux nous en dire un peu plus à ce sujet ? Je ne vois pas où ça ne correspond pas.
    ********************************
    Merci pour ta réponse, ce que je veux dire c'est que la liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static ListeGenerique<String> liste = new 
    ListeGenerique<String>(5);
    fonctionne très bien avec du string mais quand je veux l'utiliser avec un objet d'une classe "Personne" ça ne marche pas alors que mon support de cours stipule ceci :
    "Lorsque vous utilisez un type générique, vous le paramétrez avec un type de données. Ceci permet au code de s’adapter automatiquement et de réaliser la même action indépendamment du type de données."

    du coup je suis obligé de créer une autre liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    static ListeGenerique<Personne> liste2 = new 
        		  ListeGenerique<>(5);
    Vu comme c'est décrit on peut penser que le code de l'appli peut être utilisé avec la meme liste qui peut elle contenir différents types de données.
    MErci encore

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 565
    Points : 21 630
    Points
    21 630
    Par défaut
    Non ça voulait dire, "quel que soit le type de données choisi à la déclaration, l'objet fonctionnera avec ce type de données".

    Du coup tu peux choisir String ou Personne, ou tu peux choisir n'importe lequel. Quel que soit le type choisi, donc.

  7. #7
    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
    Les Generics te permettent d'écrire une classe une seule fois, mais en l'utilisant avec plusieurs types différents (String, Personne, etc...)

    Le typeage fort implique que la cohérence des types sera malgré tout respecté.

    * Une Liste<String> ne contiendra que des objets String.
    * Une Liste<Personne> ne contiendra que des objets Personne.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Février 2007
    Messages
    810
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 810
    Points : 228
    Points
    228
    Par défaut
    MErci à vous deux pour vos explications très claires !

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

Discussions similaires

  1. Quel est votre livre préféré sur Java ?
    Par Ricky81 dans le forum Général Java
    Réponses: 138
    Dernier message: 25/11/2006, 03h42
  2. Documentation sur Java Web Start
    Par Le May dans le forum JWS
    Réponses: 3
    Dernier message: 13/07/2005, 11h05
  3. questions générales sur Java Web Start
    Par Shiryu44 dans le forum JWS
    Réponses: 12
    Dernier message: 11/04/2005, 15h33
  4. Exception sur Java Web Start
    Par Le Bressan dans le forum JWS
    Réponses: 5
    Dernier message: 01/02/2005, 10h52

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