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 :

contrainte extends sur générique


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Par défaut contrainte extends sur générique
    Hello !!
    Voilà , j'ai une petite question .... je sais , encore une !!

    donc voilà je suis dans une classe qui n'est pas générique, mais prend en comptes des paramètres génériques dans son constructeur que je restitue via des getters ... j’espère que c'est pas une erreur de conception ??

    voilà à quoi ça ressemble
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        class test{
     
        protected List<? extends TreeNode> sourceNodes;
        protected Class<? extends TreeNode> creationClass;
     
        public <T extends TreeNode, U extends TreeNode> test( 
                List<T> sourceNodes, Class<U> clazz){
              this.sourceNodes = sourceNodes;
              this.creationClass = clazz;
        }
     }
    j'ai pensé que c'était possible de modifier la signature de mon constructeur comme ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    public <T, U extends TreeNode> test( 
                List<T> sourceNodes, Class<U> clazz);
    Mais mon ide me signale une érreur

    incompatible types
    required: java.util.List<? extends jocode.tree.model.TreeNode>
    found: java.util.List<T>
    Je comprends pas pourquoi ....avec cette syntaxe réduite c'est comme si T et U était en faite le même template ...

    C'est pas tros génant , je peux toujours utiliser la première version, mais j'aime bien tout savoir
    Si quelqu’un a deux minutes pour m'expliquer ou me donner un lien ...

    Sinon j'ai une autre question , là aussi sur les génériques.

    J'ai une méthode comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public <T extends TreeNode> List<T> getSelectionNodes();
    et la même qui ne retourne qu'un noeud

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public <T extends TreeNode> T getSelectionNode();
    Je sais pas si je fait bien d'inclure des paramètres générique dans la seconde méthode. En effet elle ne fait que caster dynamiquement son résultat au type déclaré de la variable affecté par son invocation.
    De plus , un cast reste nécessaire par exemple pour le passage de paramètres à une méthode , ect ....(ou un truc bizarre obj.<TreeNode>getSelectionNode())
    J'ai pas mal de getters, et si j'applique la généricité au paramêtre qui ne sont pas des collections, je suis dans le
    Pourtant ça semblerais plus logique de faire ainsi puisse que les retours de mes collections sont générique, ce qui reste super pratique ....
    Donc dilème
    Avez des conseils quand à l'utilisation des génériques?? Dois-je me passer de renvoyer des résultats génériques ??

    merci

  2. #2
    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 kimjoa Voir le message
    Je comprends pas pourquoi ....avec cette syntaxe réduite c'est comme si T et U était en faite le même template ...
    ... Supposons que tu veuilles avoir deux paramètre T et U, en n'imposant aucune contrainte sur T et en imposant que U étende TreeNode.
    Ça ressemblerait à quoi ? Écris-le. Compare avec ta "syntaxe réduite."

    Cette remarque sur la syntaxe étant faite, est-ce que ce n'est pas plus simple de faire ton constructeur ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Test(List<? extends TreeNode>, List<? extends TreeNode>) {
    ?

    Je sais pas si je fait bien d'inclure des paramètres générique dans la seconde méthode. En effet elle ne fait que caster dynamiquement son résultat au type déclaré de la variable affecté par son invocation.
    La première fait encore moins que ça, elle rassure le compilateur en lui disant que la liste renvoyée est une liste du type attendu, sans jamais s'en assurer. Ce qui provoquera tôt ou tard des ClassCastException, à un endroit moins attendu que là où ça devrait.
    Sauf si la liste est vide, mais j'imagine que ce n'est pas le but.

    J'ai pas mal de getters, et si j'applique la généricité au paramêtre qui ne sont pas des collections, je suis dans le
    Pourtant ça semblerais plus logique de faire ainsi puisse que les retours de mes collections sont générique, ce qui reste super pratique ....
    C'est ta classe, pas tes méthodes, qu'il faut paramétrer, voyons ! Les paramètres de méthodes se perdent d'un appel de méthode à l'autre. Ce qu'il te faut, c'est lier le paramètre à une instance de la classe, pour qu'il soit retenu pour tous les appels de méthodes. Et ça c'est un paramètre de classe.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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
    Je crois que ce que tu cherche à faire, c'est plutot

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        class test<T extends TreeNode>{
     
        protected List<T> sourceNodes;
        protected Class<T> creationClass;
     
        public  test(List<T> sourceNodes, Class<T> clazz){
              this.sourceNodes = sourceNodes;
              this.creationClass = clazz;
        }
     }
    ça c'est pour le général. Pour ton erreur en pratique (dans ton code donc), tu définis ton membre sourceNode comme étant un List<? extends TreeNode> mais tu tente de lui assigné la valeur passée en paramêtre qui est une List<?>, donc pas nécessairement étendant TreeNode.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Par défaut
    merci les gars pour vos réponses

    thelvin
    Supposons que tu veuilles avoir deux paramètre T et U, en n'imposant aucune contrainte sur T et en imposant que U étende TreeNode.
    Ba ouais , carrement ... encore une question à deux franc six sous ...je les accumule en ce moment

    Sinon tchize_, ton code marche très bien , d’ailleurs le tien aussi thelvin
    Du coup je sais pas si dois faire une classe générique , ou juste des constructeurs acceptant des génériques...
    Avez vous un conseil sur quand utiliser l'une des deux possibilité?

    Sinon pour mon autre remarque, je vais me limiter à l'emploie de générique via des getters , juste qu'au collections .... d'ailleurs me semble que les génériques on d'abord été prévue pour les collections ....

    En tout cas merci d'avoir pris le temps de me répondre !! a++

  5. #5
    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
    les collections ont été les classes les plus refactorées avec les generics, mais ils ne le sont pas dédiés. On met les generics sur la classes si ils ont une influence sur le comportement de cette classes (exemple, définissent un stockage interne). On les met sur les méthodes quand ils n'ont d'usage que pour la durée d'exécution de la méthode. Exemple de Generic sur la classe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<MonType> type = ...;
    MonType t = type.get(0);
    exemple sur la méthode, avec spring

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ApplicationContext ctx = ........;
    MonType t = ctx.getBean(MonType.class);

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Par défaut
    Donc dans mon exemple le mieux été de faire une classe générique étant donné que je stock les paramètres générique du constructeur ...

    merci pour ce complément d'information tchize_ c'est cool
    bye !

Discussions similaires

  1. contraintes applicatives sur une colonne
    Par adrien1 dans le forum PL/SQL
    Réponses: 2
    Dernier message: 30/07/2009, 13h40
  2. [TopCased] contrainte {unique} sur une composition
    Par big x dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 03/07/2007, 14h04
  3. [Oracle 9i] contrainte CHECK sur le type date
    Par zchallal dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/06/2006, 11h34
  4. Réponses: 2
    Dernier message: 17/02/2006, 11h20
  5. [SYBASE ASE] Rajouter une contrainte null sur une colonne
    Par Little_Goldo dans le forum Sybase
    Réponses: 1
    Dernier message: 09/02/2005, 10h48

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