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ème de liste de génériques


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut Problème de liste de génériques
    Bonjour à Tous,

    Malgré mes recherches sur le sujet je tourne en rond. c'est surement très simple mais je galère sur la création d'une liste d'élément généric.

    je m'explique:
    je réalise un ploter pour afficher des courbes donc.

    j'ai la class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Curve<T extends Number, M extends AbstractPoint<T,M>, C extends Curve<T,M,C>>
    puis les class files:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CurveComplex extends Curve<Complex, PointComplex, CurveComplex>
    CurveDouble extends Curve<Double, PointDouble, CurveDouble>
    CurveSparam extends CurveComplex
    ca ok c'est bon.

    J'ai des class de list de ces objets soit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CurvesAbstract <C extends Curve<?,?,?>> extends AbstractGroup<String, C>  // rq : AbstractGroup contient la gestion d'un objet List<C>
     
    CurvesComplex extends CurvesAbstract<CurveComplex>
    CurvesDouble extends CurvesAbstract<CurveDouble>
    CurvesSparam extends CurvesComplex

    Dans ma class ploter je cherche à avoir un object pouvant lister tous les types de courbe pour les afficher soit un type generic :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurvesAbstract<?> curves = new CurvesAbstract<Curve<?,?,?>>();
    Toutefois je ne peux pas faire cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    curves.addCurves(new CurvesSparam());
     
    //Voici le message d'erreur que j'ai:
    The method addCurves(CurvesAbstract<capture#1-of ?>) in the type CurvesAbstract<capture#1-of ?> is not applicable for the arguments (CurvesSparam)
    Je pense comprendre que le compilateur n'accepte pas que je puisse ajouter des objets même génériques mais différents au sein d'une même liste. Ok mais comment le faire tout de même ?

    quelqu'un a t-il une piste pour me sortir de là?

    J'ai pensé à faire une class intégrant la gestion de plusieurs listes de chaque type hérité de "Curve" mais cela va être très complexe de gérer et pas très optimisé. De plus si je rajoute un fils à "Curve" il faudra que je modifie cette class pour en tenir compte.

    Au final je veux simplement faire une liste de "Curve" avec les fonctions add, remove, get(int i) et iterator<Curve>.

    Merci d'avance pour votre aide.

    Sébastien.

  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 <_oodTi96Tiboo_> Voir le message
    Au final je veux simplement faire une liste de "Curve" avec les fonctions add, remove, get(int i) et iterator<Curve>.
    Que penses-tu de List<Curve<?, ?, ?>> dans ce cas ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut
    Bonsoir Thelvin,

    C'est ce que je fait indirectement :

    Dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurvesAbstract<?> curves = new CurvesAbstract<Curve<?,?,?>>();
    curves est donc un CurvesAbstract<C extends Curve<?,?,?>> qui hérite de AbstractGroup<String, C> qui à son tour implémente un objet List<C> ou C étant un Curve<?,?,?>.

    Donc l'implémentation curves est un objet qui contient un attribut de type List<Curve<?,?,?>>

    c'est bien là mon soucis. c'est que sur le papier cela doit marché. Donc je pense que j'ai loupé un truc. mais quoi???

    Sébastien.

  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 <_oodTi96Tiboo_> Voir le message
    C'est ce que je fait indirectement :

    Dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurvesAbstract<?> curves = new CurvesAbstract<Curve<?,?,?>>();
    Ah bon ?

    Si <?> était la même chose que <Curve<?, ?, ?>> je pense qu'on ne taperai jamais <Curve<?, ?, ?>>. On taperai juste <?>. Mais je serais bien infoutu de savoir comment, dans ce cas, le compilateur a fait pour deviner qu'un ? ça veut forcément dire Curve<?, ?, ?> et pas TroupeauDeMoutons<LaineBleue>.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  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
    Tu dois bien faire attetion avec tes ?

    ? ne veux pas dire "n'importe quoi", il veux dire "quelque chose de bien précis, mais que je ne connais pas". Pour dire n'importe quoi, utilise Object!

    List<?> <-- ça prend quelque chose de précis que je ne connais pas, je ne peux donc pas faire de add(maString) dedans.
    List<? extends Number> <-- ça prend quelque chose de précis étendant Number que je ne connais pas, je ne peux donc pas faire de add(Integer) dedans.
    List<? super Number> <-- ça prend quelque chose de précis qui est le parent de Number que je ne connais pas, je peux donc faire de add(Integer) dedans, car ce qui est parent de Number est aussi parent de Integer. Mais un get() me retournera de l'Object, car je ne sais toujours pas de quel parent on parle.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Tu dois bien faire attetion avec tes ?

    ? ne veux pas dire "n'importe quoi", il veux dire "quelque chose de bien précis, mais que je ne connais pas". Pour dire n'importe quoi, utilise Object!

    List<?> <-- ça prend quelque chose de précis que je ne connais pas, je ne peux donc pas faire de add(maString) dedans.
    List<? extends Number> <-- ça prend quelque chose de précis étendant Number que je ne connais pas, je ne peux donc pas faire de add(Integer) dedans.
    List<? super Number> <-- ça prend quelque chose de précis qui est le parent de Number que je ne connais pas, je peux donc faire de add(Integer) dedans, car ce qui est parent de Number est aussi parent de Integer. Mais un get() me retournera de l'Object, car je ne sais toujours pas de quel parent on parle.
    j'ai l'impression de bien utiliser les <?>. Ils sont toujours spécifié dans la définition des class en utilisant un extends. Donc normalement il n'y a pas de confusion possible.
    je pense que mon dernier poste précise bien cela.

    Séb.

    PS : je ne connaissais pas les <? super ...> même si je vois pas encore l'intérêt (je vais chercher), c'est intéressant de savoir que cela existe.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut
    Bonjour Thelvin,

    La définition de la class CurvesAbstract indique que le paramètre généric de la class extends de Curve<?,?,?> (voir mon premier post). Donc le compilateur sait que dans la déclaration CurvesAbstract<?> le ? est de type Curve<?,?,?>.

    Je sais, au lieu d'écrire cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurvesAbstract<?> curves = new CurvesAbstract<Curve<?,?,?>>();
    j'aurai du écrire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CurvesAbstract<Curve<?,?,?>> curves = new CurvesAbstract<Curve<?,?,?>>();
    Mais je suis fainéant. On se refait pas.

    je ne pense pas que le problème vienne de là. Par soucis de prudence j'ai testé la deuxième écriture ci-dessus. j'ai le même message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The method addCurves(CurvesAbstract<Curve<?,?,?>>) in the type CurvesAbstract<Curve<?,?,?>> is not applicable for the arguments (CurvesSparam)
    or je ne comprend pas, la méthode addCurves(CurvesAbstract<Curve<?,?,?>>) de la class CurvesAbstract<Curve<?,?,?>> devrait être applicable à un CurvesSparam puisque CurvesSparam hérite bien de CurvesAbstract<Curve<?,?,?>> ou plus exactement de CurvesAbstract<CurvesComplex> où CurvesComplex hérite de Curve<Complex, PointComplex, CurveComplex>
    Pourtant le compilateur me dit le contraire.

    Sébastien.

  8. #8
    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 <_oodTi96Tiboo_> Voir le message
    je ne pense pas que le problème vienne de là.
    C'est bien de penser des trucs. C'est juste dommage que là, ce soit faux.

    Citation Envoyé par <_oodTi96Tiboo_> Voir le message
    Par soucis de prudence j'ai testé la deuxième écriture ci-dessus. j'ai le même message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The method addCurves(CurvesAbstract<Curve<?,?,?>>) in the type CurvesAbstract<Curve<?,?,?>> is not applicable for the arguments (CurvesSparam)
    C'est clairement pas le même message.
    Il y a un s en trop dans CurvesSparam, ou alors j'ai rien compris de ce que tu essaies de faire. En tout cas, avec les types que tu as déclaré, ça ne peut marcher qu'avec CurveSparam avec juste un grand S et pas de petit s.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [MySQL] Problème de liste déroulante dynamique
    Par vincedjs dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 03/03/2006, 16h38
  2. Problème de liste déroulante et js...
    Par Empty_body dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/03/2006, 10h44
  3. [MySQL] Problème de listes déroulantes liées avec requêtes sql
    Par richton95 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/12/2005, 16h04
  4. Problème avec liste déroulante
    Par Invité dans le forum IHM
    Réponses: 2
    Dernier message: 14/12/2005, 21h04
  5. Problème avec listes liées entre elles et bouton "précé
    Par Oluha dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 02/08/2005, 15h10

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