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 :

[débutant] un problème avec la généricité


Sujet :

Langage Java

  1. #1
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut [débutant] un problème avec la généricité
    Bonjour,
    je suis en train de regarder comment fonctionne la généricité.
    J'ai un souci car j'ai une erreur de compilation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.Error: Unresolved compilation problem: 	The method setContent(T) in the type Panier<T> is not applicable for the arguments (Orange)
    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
    package org.cnam.fruit;
     
    public class Panier<T> {
     
    	protected T content = null;
     
    	public void setContent(T o){
    		content = o;
    	}
     
    	public T getContent(){
    		return content;
    	}
     
    	public boolean isEmpty(){
    		return content == null;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class TestFruit<T> extends TestCase {
     
    	public void test1(){
    		Panier<T> panier = new Panier<T>();
    		Orange orange = new Orange();
    		panier.setContent(orange); // ici ca coince !!! faut-il caster ??
    	}
    }
    Si je fais un cast, ca fonctionne mais je croyais que la généricité c'était pour réduire les casts (entre autre)?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    548
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 548
    Points : 635
    Points
    635
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class TestFruit extends TestCase {
     
    	public void test1(){
    		Panier<Orange> panier = new Panier<Orange>();
    		Orange orange = new Orange();
    		panier.setContent(orange); // ici ca coince !!! faut-il caster ??
    	}
    }

  3. #3
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    ok merci pour ta réponse, ca marche,
    mais en fait le truc c'est que je dois pouvoir mettre n'importe quoi dans mon panier ! Donc je précise Orange alors je suis coincé.

  4. #4
    Candidat au Club
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par julien.63 Voir le message
    Bonjour,
    je suis en train de regarder comment fonctionne la généricité.
    J'ai un souci car j'ai une erreur de compilation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.lang.Error: Unresolved compilation problem: 	The method setContent(T) in the type Panier<T> is not applicable for the arguments (Orange)
    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
    package org.cnam.fruit;
     
    public class Panier<T> {
     
    	protected T content = null;
     
    	public void setContent(T o){
    		content = o;
    	}
     
    	public T getContent(){
    		return content;
    	}
     
    	public boolean isEmpty(){
    		return content == null;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class TestFruit<T> extends TestCase {
     
    	public void test1(){
    		Panier<T> panier = new Panier<T>();
    		Orange orange = new Orange();
    		panier.setContent(orange); // ici ca coince !!! faut-il caster ??
    	}
    }
    Si je fais un cast, ca fonctionne mais je croyais que la généricité c'était pour réduire les casts (entre autre)?

  5. #5
    Candidat au Club
    Étudiant
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    salut julien si t'as un problem de compilation tu dois avoire la jvm (java vertuelle machine) et je croi que sa ira bien....

  6. #6
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    merci pour ta réponse, mais j'ai déjà la jvm !
    je pense que ce n'est pas le probléme.
    je pense que c'est que niveau de mon code.

  7. #7
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    bon du coup j'ai fait ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	public void test2(){
    		Panier<Object> panier = new Panier<Object>();
    		Orange orange = new Orange();
    		panier.setContent(orange);
    	}
    qu'en pensez-vous ?

  8. #8
    Expert éminent sénior Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 573
    Points : 15 537
    Points
    15 537
    Par défaut
    Si tu veux mettre absolument n'importequoi dans ton panier c'est l'idée.

    Tu peux même ne pas mettre de <Object> du tout, c'est l'ancienne notation(avant java 1.5) qui ne gérait pas la généricité et donc on ne pouvait travailler qu'avec des Object. ceci dit je pense que <Object> est plus clair.

  9. #9
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    ok, merci pour ta réponse

  10. #10
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    yop,
    j'enlève le "resolu", car apres avoir lu certaine doc, je me demande si l'utilisation du joker ne serait pas mieux adaptee pour ce que je veux faire; a savoir être capable de mettre n'importe quel objet dans le panier ?

    J'ai essaye de faire ceci, mais y'a des trucs qui vont pas
    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
    public class Panier {
     
    	protected List<?> content = null;
     
    	{
    		content.add(null);
    	}
     
    	public void setContent(<?> e){ // erreur de syntaxe !!!!!
    		content.add(e);
    	}
     
    	public Object getContent(){ // Object est-il le bon type de retour ??
    		return content.get(0);
    	}
     
    	public boolean isEmpty(){
    		return content == null;
    	}
    }

  11. #11
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Logiquement dans une collection tu as tendance à mettre un paquet d'objets qui ont des caractéristiques communes, donc autant passer par l'utilisation d'une interface et/ou d'une classe abstraite. Dans ton cas une classe Fruit

    Si l'on présume que Orange et Pomme sont deux classes implémentant une interface Fruit (au travers d'une classe abstraite ou non)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    List<Fruit> l = new ArrayList<Fruit>();
    l.add(new Orange());
    l.add(new Pomme());
    En général avoir une collection qui peut contenir n'importe quel Objet sans distinction est un signer de problème au niveau du design de l'appli et amène nombre de casts et/ou instanceof plutôt carrément sales.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Personnellement j'utiliserais pas une interface mais la notion d'héritage. Tu débutes en java mais est-ce que tu as eu des cours/lu des livres sur la programmation orientée objet ?

    En clair il te faudrait une classe Fruit qui contient tous les attributs et les méthodes communes à tous tes fruits. Puis, tu déclares tes classes de fruits comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Orange extends Fruit {
     
    }
    public class Cerise extends Fruit {
     
    }
    Tes fruits héritent de la classe Fruit et sont donc considérés comme étant des "Fruit" dans ton application. Désolé si ce n'est pas clair mais le mieux serait sans doute de regarder les cours sur la programmation objet de ce site...

    Enfin, pour utiliser un panier dans lequel tu peux mettre n'importe quel fruit tu le déclares comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Panier<Fruit> panier = new Panier<Fruit>();
    panier.add(new Orange());
    panier.add(new Cerise());
    C'est ce que dit sinok dans le post précédent mais lui utilise un objet ArrayList (qui est générique depuis une certaine version de java mais j'ai oublié laquelle )

  13. #13
    Membre expérimenté Avatar de julien.63
    Profil pro
    balayeur
    Inscrit en
    Décembre 2005
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : balayeur

    Informations forums :
    Inscription : Décembre 2005
    Messages : 1 348
    Points : 1 311
    Points
    1 311
    Par défaut
    merci pour vos conseils, c'est toujours bon à prendre

    En fait, je suis precisemment un cours que j'ai eu par internet. Y'a un exercice qui demande de construire une classe panier qui peut accepter n'importe quel type: Fruit, Orange, même Integer. J'ai reussi a faire un truc qui fonctionne:
    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 Panier<H> {
     
    	protected H content = null;
     
    	public void setContent(H o){
    		content = o;
    	}
     
    	public H getContent(){
    		return content;
    	}
     
    }
    mais je me suis demandé si l'utilisation du joker "?" ne serait pas plus indiqué ?

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/05/2007, 13h11
  2. [débutant][servlet]Problème avec Servlet login
    Par stago dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 10/05/2005, 00h05
  3. [Débutant(e)] Problème avec JaxB !
    Par garulfo2 dans le forum Persistance des données
    Réponses: 6
    Dernier message: 08/02/2005, 09h28
  4. [Débutant][Phppgadmin] problème avec les types
    Par PoY dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2004, 17h06
  5. Réponses: 5
    Dernier message: 19/08/2004, 11h11

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