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 :

Encore un problème de Generics


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Par défaut Encore un problème de Generics
    Bonjour,

    N'aimant pas laisser des warnings dans mon code j'aimerais trouvé une solution à mon problème utilisant des génériques.

    Voilà ma fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    protected int doCompare(Viewer viewer, Object e1, Object e2)
    {
              Comparable c1 = foo.getComparable(e1);
              Comparable c2 = foo.getComparable(e2);
     
              return c1.compareTo(c2);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Comparable<?> getComparable(Object obj) {...}
    Sachant que la méthode compareTo de Comparable<T> a pour signature et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int compareTo(Comparable<T> o)
    Je précise aussi que je sais que c1 et c2 seront du même type (par exemple deux Integer (qui implémentent Comparable<Integer>), ou deux String etc..)

    J'ai essayé pas mal de choses, mais rien qui plaise à mon compilo (à part SuppressWarnings("unchecked"), m'enfin bon)

    Merci d'avance aux gurus qui m'apporteront leur lumières

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le warning unchecked est normal à partir du moment où tu utilises des classes Generics sans les typé.

    Ici, si toi tu sais que tes objets e1 et e2 sont bien du même type et implémentent Comparable, le compilateur n'a aucun moyen de le vérifier et te signale un problème potentiel.

    Donc tu as deux solutions :

    • Soit tu utilises @SuppressWarnings, qui est la seule solution lorsqu'on utilise des classes Generics sans typage...

    • Soit tu types ta méthode doCompare() afin qu'elle accepte des objets typés :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      	protected <C extends Comparable<C>> int doCompare(Viewer viewer, C c1, C c2) {
      		return c1.compareTo(c2);
      	}
      En plus la méthode est désormais sécurisée car toute mauvaise utilisation de la méthode sera sanctionnée par un warning voir une erreur...


    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Par défaut
    Merci de cette réponse rapide
    J'avais commencé à explorer du côté de ta solution mais sans succès... Cette solution est plutôt bonne, mais ma fonction a besoin d'être appelée avec 2 Object ... donc ce n'est pas possible.

  4. #4
    Rédacteur
    Avatar de CyberChouan
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    2 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 752
    Par défaut
    Citation Envoyé par Mr. Magne Voir le message
    ma fonction a besoin d'être appelée avec 2 Object
    Dans ce cas, crée une fonction intermédiaire qui fait un cast explicite de tes "Object" avant de les envoyer à la méthode d'Adibuba afin qu'ils respectent sa signature.

    Cependant, si tu passes des "Object" à une méthode qui doit faire des comparaisons dessus, les warnings ne me paraissent pas anormaux. Ce n'est pas une manière de procéder très propre, même si tu sais à l'avance que tes objets seront du bon type...
    Avant de poster, pensez à regarder la FAQ, les tutoriaux, la Javadoc (de la JRE que vous utilisez) et à faire une recherche
    Je ne réponds pas aux questions techniques par MP: les forums sont faits pour ça
    Mes articles et tutoriaux & Mon blog informatique

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Par défaut
    J'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public Comparable<Comparable<?>> getComparable(Object obj)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    protected int doCompare(Viewer viewer, Object e1, Object e2)
    {
              Comparable<Comparable<?>> c1 = foo.getComparable(e1);
              Comparable<?> c2 = foo.getComparable(e2);
     
              return c1.compareTo(c2);
    }
    Qui marche plutôt bien, mais du coup j'ai du mal à voir comment faire mes casts dans ma fonction getComparable, par exemple pour caster une String en Comparable<Comparable<?>>

    Une idée ?

    sinon en effet la solution du supresswarning est pas mal, mais c'est pas ce que j'appelle la solution 'propre' ... si elle existe ^^

Discussions similaires

  1. Encore des problèmes avec le BDE
    Par Flint dans le forum C++Builder
    Réponses: 19
    Dernier message: 31/12/2007, 23h26
  2. [Dates] Encore un problème de date
    Par philippef dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2006, 21h30
  3. Encore des problèmes de variables
    Par mat99 dans le forum Langage
    Réponses: 1
    Dernier message: 18/11/2005, 10h26
  4. Réponses: 8
    Dernier message: 10/08/2004, 11h49
  5. Encore un probléme de date avec TADO !
    Par bNoureddine dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/02/2004, 18h22

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