Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Invité régulier
    Homme Profil pro
    Inscrit en
    décembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 8
    Points : 5
    Points
    5

    Par défaut Caster des objets dynamiquement

    Bonjour

    Je tombe sur un problème assez obscure, voici un objet qui est de classe X

    Object hBeanObject = iterator.next();

    Si je fais un getClass() sur hBeanObject j'obtiens bien X

    J'effectue ensuite l'opération suivante :
    hBeanObject.getClass().cast(class.forName("X"))

    qui devrait caster l'Object hBeanObject en objet de classe X

    J'ai une exception ClassCastException avec un stackStrace null (donc pas de détail)... je ne vois pas pourquoi

  2. #2
    Expert Confirmé
    Avatar de olivier.pitton
    Homme Profil pro olivier pitton
    Développeur Java
    Inscrit en
    juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Nom : Homme olivier pitton
    Âge : 26
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2012
    Messages : 355
    Points : 2 844
    Points
    2 844

    Par défaut

    La méthode cast te permet de caster un objet dans la classe courante. Par exemple :

    Code :
    1
    2
    3
     
    Object ob = new X();
    X x = ob.getClass().cast(ob);
    Or tu spécifies que tu veux caster la classe X en X. Mais ce sont des types différents.

    Je dirais que le problème vient de la.

    Javadoc.

  3. #3
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 721
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 721
    Points : 16 048
    Points
    16 048

    Par défaut

    Citation Envoyé par olivier.pitton Voir le message
    La méthode cast te permet de caster un objet dans la classe courante.
    Oui.

    Citation Envoyé par olivier.pitton Voir le message
    Par exemple :

    Code :
    1
    2
    3
     
    Object ob = new X();
    X x = ob.getClass().cast(ob);
    Mais cet exemple ne compile pas. ob.getClass() ne renvoie pas un Class<X> mais un Class<?>. Du coup l'appel à cast() ne renvoie pas un X mais un Object.

    Voici des exemples qui marcheraient :

    exemple 1 :
    Code :
    1
    2
    Object ob = new X();
    X x = (X)ob.getClass().cast(ob);
    ce qui est stupide, il n'y a rien de dynamique et il suffit de faire :

    Code :
    1
    2
    Object ob = new X();
    X x = (X)ob;
    exemple 2 :
    Code :
    1
    2
    Object ob = new X();
    X x = X.class.cast(ob);
    ce qui est stupide pour la même raison, il n'y a rien de dynamique et il suffit de faire la même chose que déjà dit.

    exemple 3 :
    Code :
    1
    2
    Object ob = new X();
    Object x = ob.getClass().cast(ob);
    ce qui est stupide, car on vient en gros de vérifier qu'un objet est bien de sa propre classe. Les objets n'ont pas de crise existentielle, ils sont toujours de leur propre classe. Il n'y a rien à vérifier, ce qu'il fallait faire à la place, c'est rien.

    exemple 4 :

    Code :
    1
    2
    X ob = new X();
    X x = ob.getClass().cast(ob);
    Même chose qu'au-dessus. ob étant déclaré de type X, getClass() renvoie un Class<? extends X> et cast() renvoie un X. Mais on vient juste de vérifier qu'un objet déclaré de type X et instancié, est bien d'une classe sous-type de X. Euh, si ce n'était pas le cas le compilateur ne nous aurait pas laissé le mettre dans une variable de type X. Il n'y a rien de dynamique, il n'y a rien à vérifier.

    Conclusion : ça ne sert à rien.

    Citation Envoyé par mlwacosmos
    hBeanObject.getClass().cast(class.forName("X"))

    qui devrait caster l'Object hBeanObject en objet de classe X
    Cela ne se fait pas avec un cast. Tu essaies de vérifier si l'objet est de type X. Cela se fait comme ça :

    Code :
    if( class.forName("X").isInstance(hBeanObject) ) {
    Citation Envoyé par mlwacosmos
    J'ai une exception ClassCastException avec un stackStrace null (donc pas de détail)... je ne vois pas pourquoi
    parce que ce n'est pas comme ça qu'on utilise cast(). Il faut lui donner l'obet à caster, ce que tu lui as donné est autre chose.
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
    Partagez vos connaissances, mais aussi comment s'en servir.

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    janvier 2007
    Messages
    1 331
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : janvier 2007
    Messages : 1 331
    Points : 1 615
    Points
    1 615

    Par défaut

    Dans tout ça j'avoue que je n'arrive pas à comprendre pourquoi tu voulais faire un cast de ton objet ....
    Program manager chez TraceOne. http://www.traceone.com

  5. #5
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2007
    Messages
    21 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : avril 2007
    Messages : 21 573
    Points : 38 418
    Points
    38 418

    Par défaut

    D'accord avec toi, ce code n'a ni queue ni tête et la notion de "cast dynamique" n'a pas plus de sens. Un cast, on fait ça quand on suppose qu'un objet et d'un type particuler T et qu'on veux l'assigner à une variable de type T. Or la variable est bien déclarée => donc T est connu à la compilation. Donc le code c'est


    simplement.
    Tchize (Чиз) faq java, cours java, javadoc. Pensez à et
    Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •