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

Java Discussion :

Problème types génériques


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Par défaut Problème types génériques
    Bonjour/Bonsoir à tous...
    J'apprends en ce moment les types génériques, et bien que cela m'ait paru limpide à la lecture, c'est à l'application que ça se complique. Aussi, je viens quémander votre aide!

    J'ai la classe suivante :
    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
    package generics;
     
     
     
    import scanner.*;
     
    import java.util.*;
     
     
     
    public class ListChoser<T> {
     
     
     
     
        // Definir la methode chose, qui prend en premier parametre 
     
        // un message sous forme de chaene de caracteres et en second une liste.
     
        // Cette liste est typee mais sans restriction sur les types admis.
     
        // Cette methode propose de choisir un element de la liste en saisissant
     
        // sa position dans la liste.
     
        // L'element choisi est retourne par la methode, null si le choix 0 est fait.
     
        //
     
        public T chose(String str, List<T> list){
    	System.out.println(str);
    	System.out.println("0 -> aucun");   
    	for (int i=0 ; i<list.size() ; i++) {
    		System.out.println((i+1) + " -> " + list.get(i).toString()); 
    	}
    	int j = TestScanner.saisieEntier((list.size())+1);
    	if (j==0) return null;
    	else return list.get(j-1);
    	}          // Affiche les élements contenus dans la liste, on en choisit ensuite un qui 
                       // est renvoyé par la methode. (si 0, renvoie null)
     
     
     
        public static void main(String[] args) {
     
    	// JEU DE TEST
     
     
     
    	List<Carotte> lCarottes = new ArrayList<Carotte>();
     
    	lCarottes.add(new Carotte(1));
     
    	lCarottes.add(new Carotte(2));
     
    	lCarottes.add(new Carotte(3));
     
     
     
    	List<Pomme> lPommes = new ArrayList<Pomme>();
     
    	lPommes.add(new Pomme(1));
     
    	lPommes.add(new Pomme(2));
     
    	lPommes.add(new Pomme(3));
     
     
     
    	ListChoser<Carotte> lc = new ListChoser<Carotte>();
     
     
     
    	Carotte choixCarotte = lc.chose("quelle carotte ? ",lCarottes);
     
    	System.out.println("vous avez choisi : "+choixCarotte);
     
     
     
    	//Pomme choixPomme = lc.chose("quelle pomme ? ",lPommes);
     
    	//System.out.println("vous avez choisi : "+choixPomme);
     
     
     
     
     
        }
     
    }
    Mon problème se situe donc à la toute fin de ce code...
    Je pensais qu'en instanciant mon ListChoser de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ListChoser<?> lc = new ListChoser<?>();
    Je pourrais ensuite appeler ma methode "chose" pour la liste de "Carotte" et celle de "Pomme"...
    Mais à la compilation j'ai les erreurs suivantes :
    generics/ListChoser.java:40: unexpected type
    found : ?
    required: class or interface without bounds
    ListChoser<?> lc = new ListChoser<?>();
    ^
    generics/ListChoser.java:42: chose(java.lang.String,java.util.List<capture#431 of ?>) in generics.ListChoser<capture#431 of ?> cannot be applied to (java.lang.String,java.util.List<generics.Carotte>)
    Carotte choixCarotte = lc.chose("quelle carotte ? ",lCarottes);
    Excusez moi d'être un peu vague, je suis un peu pommé...
    Sauriez vous me dire ce que je n'ai pas compris et comment faire ce que je veux faire?

    Merci en tout cas.

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Quand une classe est générique, pour l'instancier, il faut la typer. Donc, a priori, il te faut un chooser séparé pour les pommes et le carotte.


    Cependant, comme ta classe a plutot l'air d'une classe utilitaire, elle bénéficierait de certains changements structurels qui au passage te débloqueraient:
    1) elle n'a pas besoin d'être typée, le type ne concernant que les appels de méthode. Donc on type les méthodes et pas la classe
    2) la méthode peut être statique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class ListChoser {
     
        public static <T> T chose(String str, List<T> list){
    	System.out.println(str);
    	System.out.println("0 -> aucun");   
    	for (int i=0 ; i<list.size() ; i++) {
    		System.out.println((i+1) + " -> " + list.get(i).toString()); 
    	}
    	int j = TestScanner.saisieEntier((list.size())+1);
    	if (j==0) return null;
    	else return list.get(j-1);
    	}          // Affiche les élements contenus dans la liste, on en choisit ensuite un qui 
                       // est renvoyé par la methode. (si 0, renvoie null)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Carotte choixCarotte = ListChooser.chose("quelle carotte ? ",lCarottes);

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 119
    Par défaut
    Merci beaucoup!!
    Donc je place le "<T>", sur l'élément qui est "à typer"? ici juste ma méthode, mais si ça avait été ma classe, ç'aurait été dans l'en-tête? C'est bien ça?

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Alba.1337 Voir le message
    Donc je place le "<T>", sur l'élément qui est "à typer"? ici juste ma méthode, mais si ça avait été ma classe, ç'aurait été dans l'en-tête? C'est bien ça?
    Ma foi oui, mais la leçon à retenir, ici, c'est que ce besoin n'était pas un bon exemple de l'emploi de types génériques. Plutôt de méthode générique.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [C#] Problème de Cast sur un type générique
    Par Bobbledople dans le forum C#
    Réponses: 2
    Dernier message: 10/06/2009, 11h04
  2. [Access-->MSSQL]Problème type de donnée booléen
    Par guigui11 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/06/2008, 16h27
  3. Réponses: 12
    Dernier message: 23/09/2006, 12h12
  4. y a-t-il un support de types génériques pour python ?
    Par silverhawk.os dans le forum Général Python
    Réponses: 15
    Dernier message: 24/03/2006, 18h23
  5. [Oracle][Delphi 7] Problème type de champ
    Par tiennos dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/07/2004, 10h17

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