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

avec Java Discussion :

Erreur "Unchecked cast from Object to T"


Sujet :

avec Java

  1. #1
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut Erreur "Unchecked cast from Object to T"
    Bonjour,

    j'ai une méthode cloneObjectThroughSerialization que je n'arrive pas à construire correctement : pas moyen de retourner le type correct.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public <T extends Serializable> T cloneObjectThroughSerialization(T obj) {
        try {
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          ObjectOutputStream oso = new ObjectOutputStream(baos);
          oso.writeObject(obj);
          ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
          ObjectInputStream osi = new ObjectInputStream(bais);
          return (T) osi.readObject();
        } catch (IOException e) {
          throw new RuntimeException("Serialization Fail!", e);
        } catch (ClassNotFoundException e) {
          throw new RuntimeException("Serialization Fail!", e);
        }
      }
    A l'exécution, l'exception suivante est retournée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    	Type safety: Unchecked cast from Object to T
    	at org.polymorphisme.beans.SerializationUtil.cloneObjectThroughSerialization(SerializationUtil.java:141)
    	at org.polymorphisme.beans.TestSerialization.testCustomSerialization(TestSerialization.java:69)
    	at org.polymorphisme.beans.TestSerialization.main(TestSerialization.java:60)
    Merci de votre aide
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    La vache, une compilation refusée pour un simple warning de type unchecked cast, on fait pas semblant, chez toi -_-°.
    Aussi, la sérialisation n'est pas faite pour permettre un "autre clonage," dans la mesure où on sérialise parfois des singletons ou comportements similaires.

    Ceci étant dit, dans le cas présent il y a une solution assez simple : la méthode prend en paramètre une instance du type T. Donc on peut s'en servir pour faire obj.getClass() qui renvoie un objet de type Class<? extends T>.
    Tu peux t'en servir pour faire return clazz.cast(newObject);. Tout échec à ce niveau prouverait un non-respect du contrat de la sérialisation.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par thelvin Voir le message
    La vache, une compilation refusée pour un simple warning de type unchecked cast, on fait pas semblant, chez toi -_-°.
    Quelqu'un a mis "error" dans le uncheck cast des options de compilation eclipse

    Note: le plus drole, la compilation n'est pas refusée. Ca compile en remplacant la ligne par un throw Error, ce qui est bien pire. Le binaire est créé mais inutilisable

  4. #4
    Membre émérite
    Avatar de polymorphisme
    Homme Profil pro
    Publishing
    Inscrit en
    Octobre 2009
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Publishing
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2009
    Messages : 1 460
    Points : 2 371
    Points
    2 371
    Par défaut
    Note: le plus drole, la compilation n'est pas refusée. Ca compile en remplacant la ligne par un throw Error, ce qui est bien pire. Le binaire est créé mais inutilisable
    Etonnant oui

    Ceci dit, je n'ai pas trouvé de solution claire. J'ai donc fini par modifier l'option dans la configuration d'Eclipse.
    Article : Installation de Cocoon
    Je ne réponds pas aux MP à caractère technique.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 8
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    si tu sais a l'avance de quel type de class seras ton retour tu peux faire de cette façon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    public void fct () {
     
         MyClass mc = cloneObjectThroughSerialization (objToClone, MyClass.class);
    }
     
    public <T extends Serializable> T cloneObjectThroughSerialization(T obj, Class<T> clazz) {
     
         ...
         return T;
         ...
    }
    le type de retour est définis par le deuxième paramètre de la méthode

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    What? -_-°
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    C'est exactement ce que tu a proposé Thelvin au passage

    C'est d'ailleurs la méthode retenue par la méthode load de hibernate pour typer le retour

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Hum, moi ce que j'ai proposé c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public <T extends Serializable> T cloneObjectThroughSerialization(T obj) {
      Class<? extends T> clazz = obj.getClass();
      ...
      Object deserialized = ...
      ...
      return clazz.cast(deserialized);
    }
    Ça compile et compte sur le bon fonctionnement de la sérialisation, sous peine de ClassCastException.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ha tiens, j'avais pas vu que getClass() avait changé à partir de java 6


    On en apprends tous les jours.

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    En fait Java 5, avec l'apparition des génériques. Un traitement particulier que les compilateurs doivent honorer et qui a été introduit à ce moment-là.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par thelvin Voir le message
    En fait Java 5, avec l'apparition des génériques. Un traitement particulier que les compilateurs doivent honorer et qui a été introduit à ce moment-là.
    En tout cas c'est seulement documenté à partir de java 6 Merci pour l'info ^^

Discussions similaires

  1. Erreur "Cannot cast from Object to int"
    Par FatmaFafa dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 11/08/2012, 18h33
  2. Erreur "JACOB Can't get object clsid from progid"
    Par Gaspard22 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 01/08/2012, 15h29
  3. Type safety: Unchecked cast from List to List<*>
    Par Altenide dans le forum Langage
    Réponses: 9
    Dernier message: 30/06/2011, 15h38
  4. Réponses: 11
    Dernier message: 06/05/2009, 17h13
  5. Erreur de syntaxe clause FROM affichage Tous dans Listbox
    Par Lou Pitchoun dans le forum Access
    Réponses: 9
    Dernier message: 21/09/2005, 10h40

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