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

Collection et Stream Java Discussion :

Casting Object en Hashmap


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé Avatar de toflofr
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2003
    Messages : 63
    Par défaut Casting Object en Hashmap
    Bonjour,

    Et bien voici mon problème j'ai une variable de type Object, et je veut la caster en Hashmap. (Pour info je passe une Hashmap au notify).
    Voici mon code.

    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
                        public void notify(Object objectData)
                        {                       
                            logger.debug("Entree dans le notify");
                            //recup des infos                        
                            HashMap mapDataBuffer = new HashMap();
                            try
                            {                            
                                mapDataBuffer = (HashMap)objectData;
                            }
                            catch(ClassCastException ce)
                            {
                                logger.debug("pb de casting");
                                logger.debug(ce.getMessage());
                                logger.debug(ce.getLocalizedMessage());
                                logger.debug(ce.getCause());
    Et le message que je recup:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Nov 21 13:01:12 localhost.localdomain MainProcess.All:ID1: DEBUG pb de casting
    Nov 21 13:01:12 localhost.localdomain MainProcess.All:ID1: DEBUG
    Nov 21 13:01:12 localhost.localdomain last message repeated 2 times
    Donc en gros je n'y arrive pas, et j'ai aucun retour d'erreur concret. Je travail sur un environnemet particulier utilisant la JDK1.4.2_15.

    Si vous avez des suggestions.

    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Tu peux fournir la sortie de objectData.getClass().getName() ?

  3. #3
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Ben à priori si le cast échoue c'est qu'objectdata n'est pas du type HashMap justement. Mais il est vrai qu'il est bizarre que tu n'aies rien dans tes logs.

    Essaie d'afficher le type réel d'objectdata voir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    logger.debug(objectData.getClass());
    Edit: grilled!

  4. #4
    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 Deadpool Voir le message
    Ben à priori si le cast échoue c'est qu'objectdata n'est pas du type HashMap justement. Mais il est vrai qu'il est bizarre que tu n'aies rien dans tes logs.
    La JVM a la mauvaise habitude de ne pas fournir de message explicite dans ses exceptions (ClassCastException, OutOfMemory, etc..), donc getMessage() et autres renvoient rien ou une chaine vide...


    Cela a été corrigé avec Java 5.0 ou 6 (je ne suis plus tout à fait sûr ).

    a++

  5. #5
    Membre confirmé Avatar de toflofr
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2003
    Messages : 63
    Par défaut
    Nov 21 13:23:25 localhost.localdomain MainProcess.All1: DEBUG objectData.getClass(): class java.util.HashSet

    HashSet est comme HashMap, car je comprend pas pourquoi il y a eut une telle transformation.

  6. #6
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,



    La JVM a la mauvaise habitude de ne pas fournir de message explicite dans ses exceptions (ClassCastException, OutOfMemory, etc..), donc getMessage() et autres renvoient rien ou une chaine vide...


    Cela a été corrigé avec Java 5.0 ou 6 (je ne suis plus tout à fait sûr ).

    a++
    Ok, merci de la précision.

    Citation Envoyé par toflofr Voir le message
    Nov 21 13:23:25 localhost.localdomain MainProcess.All1: DEBUG objectData.getClass(): class java.util.HashSet

    HashSet est comme HashMap, car je comprend pas pourquoi il y a eut une telle transformation.
    Heu non rien à voir.

    Un Set est un ensemble d'éléments non dupliqués, une Map est un ensemble de couples Clés-valeurs.

  7. #7
    Membre confirmé Avatar de toflofr
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2003
    Messages : 63
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                Map mapReportInfo = new HashMap();
    	    mapReportInfo.put("reportName", reportName);
    	    mapReportInfo.put("tagData", tagData);            	    
     
    	    listener.notify( mapReportInfo );
    Voilà comment j'appelle mon notify, et je comprend pas pourquoi je me retrouve avec une HashSet.

    Avec ça, j'arrive pas à récup mes valeurs avec mes clefs.

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Tu n'appelles pas listener.notify(...) ailleurs dans ton programme ?

    Il y a forcément un moment ou tu appelles listener.notify(...) en passant en paramètre une HashSet !

  9. #9
    Membre confirmé Avatar de toflofr
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2003
    Messages : 63
    Par défaut
    Je suis sure à 100% de ne pas avoir un autre notify avec une HashSet. Ensuite je pense que j'ai mal utilisé la notion de CallBack.

    Enfin la je suis un peu perplexe quand meme.

    Pour tester j'ai essayer de regarder le contenu de la HashSet recup, et la valeur zero du array est la valeur que j'avais mis en clef c'est à dire "reportName", et en valeur 1 l'autre clef "tagData".

    Pourquoi une telle transformation en HashSet ? Est-il possible de la reconvertir en HashMap ?

  10. #10
    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
    Il n'y a pas de transformation en HashSet... Vérifies ton code et la compilation...

    Il y a une raison particulière pour que tu n'utilises pas directement un type Map en paramètre au lieu de Object ?

    a++

  11. #11
    Membre confirmé Avatar de toflofr
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2003
    Messages : 63
    Par défaut
    j'utilise une interface dejà pas mal usité dans le programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public interface Callback {
     
    	public void notify(Object workUnit);        	
     
        }
    Et je ne peut pas me permettre de mettre une Map à la place.

    Par contre je viens de m'apercevoir que j'ai un pseudo warning affiché par JDevlopper, "unchecked from Map to V unsound but tolered" au niveau de
    mapReportInfo.put("tagData", tagData);

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Juste pour tester, ce que tu peux faire c'est changer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void notify(Object workUnit);
    en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void notify(Map workUnit);
    Et regarder les endroits où ton compilateur n'est pas content (ça va te permettre de retrouver où est passé le HashSet en paramètre du notify).

    Il est souvent très utile de s'appuyer sur le compilateur pour détecter ce genre d'erreurs.

  13. #13
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 442
    Par défaut
    Citation Envoyé par toflofr Voir le message
    j'ai un pseudo warning affiché par JDevlopper, "unchecked from Map to V unsound but tolered" au niveau de
    mapReportInfo.put("tagData", tagData);
    Ce warning te dit de spécifier le type des éléments que tu vas mettre dans ta Map :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Map<String, String> mapReportInfo = new HashMap<String, String>();
    mapReportInfo.put("reportName", reportName);
    mapReportInfo.put("tagData", tagData);
    ...

  14. #14
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Citation Envoyé par Duc Lebowski Voir le message
    Ce warning te dit de spécifier le type des éléments que tu vas mettre dans ta Map :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Map<String, String> mapReportInfo = new HashMap<String, String>();
    mapReportInfo.put("reportName", reportName);
    mapReportInfo.put("tagData", tagData);
    ...
    Il est en Java 1.4 donc pas de Generics.

    toflofr si tu utilise un IDE, tu as bien mis en 1.4 en niveau de compilation?

    Note bien que ce n'est pas lié à ton problème.

  15. #15
    Membre confirmé Avatar de toflofr
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2003
    Messages : 63
    Par défaut
    Ok bon, je m'escuse aupres de tous j'avais un .keySet(), qui me le transformait en HashSet.

    Mais Bon je vous remerci tous de votre aide, et j'ai apris de nombreuse astuce telle que:
    - objectData.getClass() qui se releve pas mal utile.
    - Et j'ai pu me documenter en Generics.

    Merci à vous.

    Et longue vie à developpez.com

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

Discussions similaires

  1. Unable to cast object of type "System.Windows.Application"
    Par OminiuS dans le forum Silverlight
    Réponses: 11
    Dernier message: 15/09/2010, 16h28
  2. [Stockage] String, Object, List, HashMap
    Par gojira dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 13/06/2010, 01h17
  3. Réponses: 11
    Dernier message: 06/05/2009, 17h13
  4. Cast Object[] en String[][]
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 11/10/2007, 15h12
  5. problème de cast object
    Par root76 dans le forum Langage
    Réponses: 14
    Dernier message: 12/04/2007, 13h42

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