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 :

Type safety: Unchecked cast from List to List<*>


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de Altenide
    Homme Profil pro
    Formateur en technologies web
    Inscrit en
    Décembre 2008
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Formateur en technologies web
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2008
    Messages : 129
    Par défaut Type safety: Unchecked cast from List to List<*>
    Bonjour,

    J'ai une méthode qui me récupère une liste d'objets via une requete hql. Tous ce passe bien hormis ce warning : Type safety: Unchecked cast from List to List<Utilisateur>

    sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (List<Utilisateur>) session.createQuery("from Utilisateur").list();
    Je ne vois pas trop comment checker le cast en question ..

    Avez vous une idée ?? merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    	@Override
    	public List<Utilisateur> listTousLesUtilisateurs() {
    		log.debug("Entering in  List<Utilisateur> listTousLesUtilisateurs()");
     
    		Session session = HibernateUtil.getSession();
    		try {
    			List<Utilisateur> q = (List<Utilisateur>) session.createQuery("from Utilisateur").list();
     
    			return q ;			
    		}
    		finally {
    			session.close();
    			log.debug("Exit listTousLesUtilisateurs()");
    		}		
     
    	}

  2. #2
    Membre chevronné
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2010
    Messages
    158
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2010
    Messages : 158
    Par défaut
    C'est juste un warning...

    Le compilateur ne peut pas certifier que le cast se passera bien, et il te prévient.
    Si toi tu es sûr que la liste retournée sera bien une List<Utilisateur>, tu peux gaiement ignorer ce warning, cela n'empêchera pas le code de compiler ni de s'exécuter.

    Si tu ne veux plus le voir, tu peux utiliser l'annotation @SuppressWarnings("unchecked").

  3. #3
    Membre confirmé Avatar de Altenide
    Homme Profil pro
    Formateur en technologies web
    Inscrit en
    Décembre 2008
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Formateur en technologies web
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2008
    Messages : 129
    Par défaut
    merci, c'est bien ce que je fais la plupart du temps sans trop aimer utiliser les supressWarnings. Je me demandais comment faire différemment.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par Altenide Voir le message
    Je ne vois pas trop comment checker le cast en question ..
    Normal, c'est impossible avec un cast .

    Vu que les données sont produites par hql, on ne sait pas une liste de quoi est produite. Il n'y a aucun moyen de prouver au compilateur que c'est bien une List<Utilisateur>.

    Si tu es absolument certain que ce code ne peut pas et ne pourra jamais fournir autre chose que des Utilisateur dans la List, alors tu peux sans doute ajouter un @SuppressWarnings("unchecked") :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @SuppressWarnings("unchecked")
    List<Utilisateur> q = session.createQuery("from Utilisateur").list();
    Dans le cas contraire, il vaut mieux vérifier avant d'essayer de persuader le compilateur. Moi je me fais la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static <T> List<? extends T> entype(List<?> list, Class<T> type) {
      for(Object item : list) {
        type.cast(item); // generate a ClassCastException if invalid
      }
      @SuppressWarnings("unchecked")
      List<? extends T> typedList = (List<? extends T>)list;
      return typedList;
    }
    Qui peut ensuite s'utiliser comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<? extends Utilisateur> q =
      entype(session.createQuery("from Utilisateur").list(), Utilisateur.class);
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé Avatar de Altenide
    Homme Profil pro
    Formateur en technologies web
    Inscrit en
    Décembre 2008
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Formateur en technologies web
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2008
    Messages : 129
    Par défaut
    exactement ce que je tentais de faire. merci pour le coup de main.

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


    Même sans vérification manuelle, en cas d'erreur tu obtiendras une ClassCastException lors de l'utilisation de la liste.


    Si la quantité de données est importante, il est donc préférable d'éviter de vérifier le type de toutes les données de la collection.


    a++

  7. #7
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Même sans vérification manuelle, en cas d'erreur tu obtiendras une ClassCastException lors de l'utilisation de la liste.
    Oui, mais là on l'a au moment où le code demande que la liste soit typée.

    (sauf si la liste qu'on a typée est encore utilisée ailleurs et que cet ailleurs peut lui insérer un objet du mauvais type, auquel cas la méthode que j'ai présentée est inadaptée. La seule "solution sûre" est de copier la liste non typée dans une liste typée.)

    Citation Envoyé par adiGuba Voir le message
    Si la quantité de données est importante, il est donc préférable d'éviter de vérifier le type de toutes les données de la collection.
    Oui.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre confirmé Avatar de Altenide
    Homme Profil pro
    Formateur en technologies web
    Inscrit en
    Décembre 2008
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Formateur en technologies web
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2008
    Messages : 129
    Par défaut
    Envoyé par adiGuba
    Si la quantité de données est importante, il est donc préférable d'éviter de vérifier le type de toutes les données de la collection.
    Ok, je vais m'en tenir au supressWarnings dans ce cas.

  9. #9
    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
    Justement : dès qu'on a un warning sur les Generics (ou qu'on utilise un @SuppressWarnings("unchecked")), le code n'est plus sûr à 100% du point de vue compilateur.

    Donc c'est le développeur qui doit prendre cette responsabilité en charge. A partir de là si on est sûr que la liste renvoyé contiendra uniquement des objets d'un certain type il n'y a pas de soucis à caster, et la vérification est une peu inutile... si ce n'est détecter l'erreur un peu plus tôt.

    a++

  10. #10
    Membre confirmé Avatar de Altenide
    Homme Profil pro
    Formateur en technologies web
    Inscrit en
    Décembre 2008
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Formateur en technologies web
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2008
    Messages : 129
    Par défaut
    ok. merci j'ai compris.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/03/2015, 10h57
  2. Erreur "Unchecked cast from Object to T"
    Par polymorphisme dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 27/01/2014, 21h15
  3. Cast Dynamique d'une liste d'objet
    Par luimême dans le forum C#
    Réponses: 12
    Dernier message: 15/07/2008, 18h21
  4. Regrouper une liste en liste de listes
    Par West01 dans le forum Prolog
    Réponses: 12
    Dernier message: 14/03/2008, 14h07
  5. Réponses: 11
    Dernier message: 23/08/2007, 13h12

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