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 :

Problèmes avec les generics


Sujet :

Langage Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 75
    Points
    75
    Par défaut Problèmes avec les generics
    salut

    j'ai un probleme qui merite un peu de reflexion cela dit je crois que vous pouvez me repondre.

    j'ai une interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Interface Noeud <T>{ T getMachin(); }
    j'ai une autre interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Interface Nomenclature <T> {
       void updateCurrent(T t);
       .....
       List <Node <T>> getChildren();
    }

    je note que tous les fonctions sont resolus à part la derniere.

    maintenant je vous presente la classe qui implemente tout ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Activites implements Nomenclature<ActDto>{
          public List<Node<ActDto>> getChildren() {
    }
    regarder un peut le type de retour , c'est normal qu'il soit comme ça , je suis tout à fait d'accord, le bleme des blemes c'est qu'il ne veut ni se caster ni rien et je ne sais pas comme resoudre ce probleme.

    puisque au fond cette fonction ne fait pas des truc extra-ordinaire , il renvoie juste une liste à l'aide un getter. sauf que la type est incompatible.

    j'ajoute que il ya des fonction pareil que j'ai pu resodre avec le cast , mais avec une difference , c'est que cette fonction à comme type de retour une LIST ce qui n'est pas le cas pour les autres.

    n'hesitez pas à me faire part de vos suggestions , je suis preneur de toutes les propositions.

  2. #2
    Membre éclairé Avatar de g_rare
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    608
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 608
    Points : 683
    Points
    683
    Par défaut
    Déjà c'est normal qu'il y ait "Noeud" et "Node" ?!...

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Dis-moi si je me trompe, mais j'ai l'impression que tu oublies simplement de faire un import du package java.util :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    import java.util.*;
    Sinon, donnes-nous plus de précisions. Le problème survient-il à la compilation ou à l'exécution ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 75
    Points
    75
    Par défaut
    merci à vous pour vos reponse d'abord.

    alors pour repondre g_rare, bonne remarque, mais sache que c'est pas ça l'erreur, c'est juste une faute de frappe je dirai, je changerai de toute façon.

    pour repondre à hda35, je ne crois pas que l'erreur provient de ça import java.util.* , puisqu'il faut savoir qu'avec eclipse il suffit d'un raccourci de "shift+ctrl+o" pour qu'il import toutes les librairies dont j'ai besoin, et justement j'ai verifié que java.util.List exite.

    je rajoute un indice qui pourra peut etre vous aidez.
    quand le type de retour est: Noeud<ActDto> et moi je lui renvoie activityNode il l'accepte .
    quand le type de retour est: List <Noeud<ActDto> > et moi je renvoie List <activityNode > il n'accepte pas
    bizarre nooon

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    activityNode est un type (classe ou interface) ou bien une variable ? J'ai l'impression que tu précise le type générique avec une variable et non avec un type.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 75
    Points
    75
    Par défaut
    je ne crois pas que c'est ça l'erreur puisque activityNode c'est une classe ou plus presicemment c'est DTO, donc il n y a pas de probleme dans ce cote.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Si j'ai bien compris ta construction, ActivityNode est une interface qui hérite du type Node<ActDto>. Dans ce cas, si tu veux absolument conserver le caractère générique de ton code, le type de retour de ta méthode doit être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    List<? extends Noeud<ActDto>>

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 75
    Points
    75
    Par défaut
    ok je crois que j'ai pas bien expliqué

    je vais donner là juste les prototypes de classe pour mieux comprendre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class activityDto { ...... }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Activities implment Nomenclature<activityDto> { 
     
               public List<Node<ActivityDto>> getChildren();
    ...}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public classc activityNode implements Node<ActivityDto>{..........}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    interface Node<T>{.....}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    interface Nomenclature<T>{.....}

    j'espere que c'est clair mnt et merci pour l'interet

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par mehdi_swatch
    ok je crois que j'ai pas bien expliqué
    Je n'osais pas le dire publiquement

    Je me suis tromper dans la réponse que j'ai donné juste au-dessus, je voulais écrire Node au lieu de Noeud. Mais le principe reste le même. On a donc maintenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public class Activities implment Nomenclature<ActivityDto> {
       public List<? extends Node<ActivityDto>> getChildren();
    }
    Je pense que cette fois c'est bon

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 75
    Points
    75
    Par défaut
    il faut savoir que sur eclipse quand t'as une classe qui implmente une interface il suffit juste de cliquer 3 cliques pour qu'il te genere toutes les fonctions que tu dois implmenter avec leurs prototypes excate,

    cela dit quand je fais c 3 cliques il me sort le prototype suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Node<ActivityDto>> getChildren();
    qui ne doit pas etre changer sinon il signale qu'il faut implementer la fonction en question du moment que je lui ai changé la signature.

    resumé il ne faut pas que je change la signature.

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Cette fois, je crois bien que j'ai la solution définitive

    J'oubliais que la méthode getChildren était hérité de l'interface Nomenclature. Il faut donc aussi modifier celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Nomenclature<T> {
    	public List<? extends Node<T>> getChildren();
    }

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    160
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 160
    Points : 75
    Points
    75
    Par défaut
    merci bcp pour ton aide

    je ne sais pas si je peux te demander une autre chose.

    est ce que tu peux m'expliquer ce que veut dire exactement ce que t'a fait , j'ai une vague idee , mais je veux une confirmation par le proprietaire

    ou bien donne moi juste une petite indication où je pourrai trouver ça dans un site ou un tutoriel

    merci encore une fois

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Il existe bien un tuto Java concernant les génériques sur dvp, mais je n'arrive plus à le retrouver. Si ma mémoire est bonne (ce n'est pas gagné d'avance), il était écrit par Romain Guy.

    En deux mots, lorsqu'on veut préciser un type de retour ou d'un argument, on précise un nom de classe. Il sera alors possible de passer une instance de cette même classe ou bien d'une sous-classe. Pour apporter à la programmation générique façon Java la rigueur qu'apporte l'héritage dans la programmation orienté objet, c'est le mot-clé extends qui a été mis a profit avec l'utilisation du ? pour désigner le type contraint. Cette écriture permet encadrer l'utilisation des types génériques sur le principe de l'héritage.

    Java, c'est bien

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

Discussions similaires

  1. Problème avec les Generics et héritage
    Par jojodu31 dans le forum Langage
    Réponses: 5
    Dernier message: 17/06/2010, 10h04
  2. [Problème] avec les generics
    Par Prodejeu dans le forum Langage
    Réponses: 6
    Dernier message: 29/06/2006, 12h48
  3. Problème avec les apostrophes
    Par misterbillyboy dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/07/2003, 16h39
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. []Problème avec les formulaires Outlook
    Par davidinfo dans le forum Outlook
    Réponses: 6
    Dernier message: 05/12/2002, 09h59

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