1. #1
    Invité régulier
    Homme Profil pro
    Inscrit en
    décembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2007
    Messages : 9
    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
    Développeur Java
    Inscrit en
    juin 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Â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 845
    Points
    2 845

    Par défaut

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    10 332
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 10 332
    Points : 17 246
    Points
    17 246

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Object ob = new X();
    X x = (X)ob;
    exemple 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 38
    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
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2007
    Messages : 22 756
    Points : 43 178
    Points
    43 178

    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 is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

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