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 :

Convertir un List en List<>


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Convertir un List en List<>
    Hello,

    J'appelle une fonction de JDOM qui me renvoie une structure List d'objets Element.
    J'ai besoin de cette liste pour l'envoyer à une fonction qui prend en paramètre une structure List<Element>.

    Ce passage de List à List<Element> occasionne de la part d'Eclipse un avertissement. Or, je déteste les avertissements (moins que les erreurs, toutefois).

    Y a-t-il un moyen de gérer ce problème proprement ?

    Merci.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    338
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2008
    Messages : 338
    Par défaut
    l'annotation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @SuppressWarnings("unchecked")
    ne peut pas faire l'affaire quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<Element> list= (List<Element>) taListe;
    A++

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Par défaut
    Si tu ne veux pas remplir ton code d'annotations tu peux configurer eclipse :


    Preferences>Java>Compiler>Errors/Warnings :

    Generic Types
    - Unchecked generic type operation Warning



    Tu vas comme ci dessus et tu mets "ignore" à la place de "warning"

    Attention : tu vas effacer tous les warnings relatifs à cette régle, il faut que tu sois sur de ce que tu fais.

    Bonne chance dans ta croisade contre les warnings

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    J'espérais pouvoir intervenir au niveau du code...
    Parce que là, c'est un peu cacher la misère. :-)

    Merci tout de même !

  5. #5
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    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 690
    Par défaut
    Ce warning n'est pas la pour rien, il indique bien qu'il ne peux pas garantir que ta liste contient bien ce qu'elle est censée contenir.

    Si tu veux absolument intervenir au niveau du code, tu peux créer une nouvelle liste et la remplir avec les champs de l'ancienne liste en les castant individuellement. Ainsi il sera garanti que ta nouvelle liste sera correcte(ClassCastException sinon).
    Mais inutile de préciser que c'est hardcore. Si tu es sur que ta liste est bonne, le @SuppressWarnings("unchecked") est fait pour ça.

  6. #6
    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
    À noter qu'il est possible de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @SuppressWarnings("unchecked")
    List<Element> list= (List<Element>) taListe;
    Auquel cas le SuppressWarnings ne s'applique qu'à la déclaration de la variable list. Une désactivation de warning très localisée, donc.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    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,

    Citation Envoyé par Uther Voir le message
    Ce warning n'est pas la pour rien, il indique bien qu'il ne peux pas garantir que ta liste contient bien ce qu'elle est censée contenir.
    +1

    Les Generics te garantissent un code type-safe, c'est à dire un code qui ne produira aucune erreur de typage (pas de ClassCastException).

    Or ce n'est pas du tout le cas du code pre-Java 5 sans Generics où tu es obligé de gérer par toi même le typage.

    Lorsque tu affectes une List dans une List<String> par exemple, le compilateur n'a aucun moyen de vérifier la cohérence de l'ensemble. En clair il ne peut pas détecter que la liste contiennent bien le bon type, et il ne peut pas garantir d'une mauvaise utilisation via la référence non-paramétré.

    Le problème c'est que si un objet paramétré contient un élément du mauvais type, cela ne pourra pas être détecté lors de l'affectation. Au contraire cela va engendré une erreur à un moment inattendu, et rendre le tout difficilement débuggable...


    Le @SuppressWarnings("unchecked") permet dans ce cas de dire au compilateur que tu sais ce que tu fais, et que tu prend la responsabilité de la cohérence des types.
    C'est souvent nécessaire lorsque tu manipules l'ancienne API de Collections (sans Generics) ou la reflection...



    Tu peux éviter de multiplier cela en te faisant une méthode de cast non-sécurisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	@SuppressWarnings("unchecked")
    	public static <A,B extends A> B unsafeCast(A object) {
    		return (B)object;
    	}
    Mais il faut bien garder à l'esprit que cela peut provoquer des erreurs par la suite...


    Si tu veux un code parfaitement sûr, tu es obligé de créer une nouvelle liste et de vérifié tous les éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public static <T> List<T> genericList(Collection<?> source, Class<T> type) throws ClassCastException {
    		List<T> list = new ArrayList<T>(source.size());
    		for (Object object : source) {
    			list.add( type.cast(object) );
    		}
    		return list;
    	}

    a++

Discussions similaires

  1. Convertir un .csv en liste de dictionnaire
    Par soucou dans le forum Général Python
    Réponses: 1
    Dernier message: 09/11/2012, 11h38
  2. convertir une hastable en list
    Par cyrano_de_bergerac dans le forum C#
    Réponses: 8
    Dernier message: 09/06/2008, 16h36
  3. Regrouper une liste en liste de listes
    Par West01 dans le forum Prolog
    Réponses: 12
    Dernier message: 14/03/2008, 14h07
  4. Réponses: 7
    Dernier message: 10/10/2007, 11h29
  5. Convertire un Objet on List
    Par mouvma dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/08/2007, 09h35

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