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 :

Problème de cast


Sujet :

Langage Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Par défaut Problème de cast
    Bonjour,
    voila je ne suis pas une fèche en java et je commence à m'énerver sur un problème de cast ( ou peut être que je n'utilise pas la bonne méthode ).

    Alors voila j'ai un objet A qui contient une collection d'objet B et/ou B1 et/ou B2 (B1 et B2 héritant de B) Ce que je sui en train de faire c'est une méthode pour cloner certain élément de B. J'ai bien implémenter la méthode clone de mes classes B, B1, B2.

    A -> Gabarit
    B -> GabaritElement
    B1 -> GabaritNote
    B2 -> GabaritCumul

    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
     
    public void cloneGabaritVague(Gabarit gabarit, Vague source, Vague cible) {
     
    	// collection chargée par hibernate
    	Set<GabaritElement> ges = gabarit.getElementsByVague(source);
    	for (GabaritElement element : ges) {
    		log.debug( "Object : " + element + " | " + element.getClass().getName() );
    		// on clone l'objet - et c'est la que ca plante 
                    // model.GabaritElement cannot be cast to model.GabaritNote
    		GabaritElement ge = (GabaritElement) element.clone();
    		// on modifie l'objet cloné
    		ge.setVague(cible);
    		// on sauvegarde avec Hibernate
    		gabaritElementManager.save( ge );
    	}
    }

    l'erreur compléte :

    -------------------------------------------------------------------------------
    Test set: service.GlobalManagerTest
    -------------------------------------------------------------------------------
    Tests run: 3, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 12.141 sec <<< FAILURE!
    testCloneGabaritVague(service.GlobalManagerTest) Time elapsed: 0.484 sec <<< ERROR!
    java.lang.ClassCastException: model.GabaritElement cannot be cast to model.GabaritNote
    at model.GabaritNote.clone(GabaritNote.java:51)
    at service.impl.GlobalManagerImpl.cloneGabaritVague(GlobalManagerImpl.java:123)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:304)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:139)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:107)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy38.cloneGabaritVague(Unknown Source)
    at service.GlobalManagerTest.testCloneGabaritVague(GlobalManagerTest.java:119)



    Un peu d'aide ne serait pas de refus. ca commence vraiment àme prendre le chou et biensur je suis déjà à la bourre.

    Merci d'avance, Julien.

  2. #2
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    Peux-t-on voir la méthode clone dans GabaritNote.java, surtout vers la ligne 51

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Par défaut
    Effectivement je ne suis même pas allé voir...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public Object clone(){
     
    	GabaritNote gabaritNote = (GabaritNote) super.clone(); // <-- ligne 51
    	gabaritNote.setGroupeNote(groupeNote);
     
    	return gabaritNote;
     
    }

  4. #4
    Membre chevronné Avatar de billynirvana
    Homme Profil pro
    Architecte technique
    Inscrit en
    Décembre 2004
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 472
    Par défaut
    D'après l'erreur capturée, la méthode super.clone() retourne un objet GabaritElement, alors que tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GabaritNote gabaritNote = (GabaritNote) super.clone();
    Tu peux te débrouiller tout seul maintenant?

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


    Ce que je ne comprend pas c'est que tu manipules des GabaritElement et tu te retrouves dans des GabaritNote...

    Il y a une relation entre ces deux classes ???

    a++

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Par défaut
    Citation Envoyé par billynirvana Voir le message
    D'après l'erreur capturée, la méthode super.clone() retourne un objet GabaritElement, alors que tu fais un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GabaritNote gabaritNote = (GabaritNote) super.clone();
    Tu peux te débrouiller tout seul maintenant?
    j'aimerais mais je ne vois pas bien comment faire. est-ce que je peux me sservir de la méthode clone de la classe mère. ou faut il que je réimplémente tout.


    Citation Envoyé par adiGuba Voir le message
    Salut,

    Ce que je ne comprend pas c'est que tu manipules des GabaritElement et tu te retrouves dans des GabaritNote...

    Il y a une relation entre ces deux classes ???
    a++
    ui GabaritNote est une sous classe de GabaritElement.

  7. #7
    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
    Citation Envoyé par jc63 Voir le message
    j'aimerais mais je ne vois pas bien comment faire. est-ce que je peux me sservir de la méthode clone de la classe mère. ou faut il que je réimplémente tout.
    (...)
    ui GabaritNote est une sous classe de GabaritElement.
    Fait voir la méthode clone() de GabaritElement dans ce cas. Le problème vient surement de là

    a++

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Par défaut
    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
     
    public Object clone(){
     
    	GabaritElement ge = new GabaritElement();
     
    	ge.setElement(element);
    	ge.setGabarit(gabarit);
    	ge.setVague(vague);
    	ge.setUsed(used);
    	ge.setCommentaire(commentaire);
    	ge.setDescription(description);
    	ge.setNc(nc);
    	ge.setTypeElement(typeElement);
     
    	return ge;
    }

  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
    Ok je comprend le problème...

    La méthode clone() de GabaritElement est mal implémenté.
    Pour faire une vrai méthode clone() il faut obligatoirement appelé la méthode super.clone() (ce qui revient à appeler la méthode clone de Object). Cette dernière crée un objet du même type que le type réel de l'objet...

    Dans ton code la méthode GabaritNote.clone() appelle GabaritElement.clone() qui retourne un objet de type GabaritElement qui ne peut logiquement pas être caster en GabaritNote...

    Bien sûr pour cela il faut implémenter Cloneable, et ta méthode clone() devrait plutôt ressembler à ceci :
    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
    17
    18
    	public Object clone() {
    		try {
    			// On appele la méthode clone() de la classe parente,
    			// qui doit elle même faire de même jusqu'à appeler
    			// la méthode clone de Object :
    			Object cloned = super.clone();
     
    			// On fait eventuellement quelques traitements sur l'objet cloné,
    			// Mais le système de cloneage a théoriquement initialisé tous
    			// les champs de la nouvelle instance donc c'est souvent inutile
     
    			// On retourne l'instance cloné :
    			return cloned;
    		} catch(CloneNotSupportedException e) {
    			// Ne devrait jamais arriver si on implémente Cloneable :
    			throw new RuntimeException(e);
    		}
    	}
    Plus d'info : Cloner en Java

    a++

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Par défaut
    Merci pour vos réponses et surtout la dernière. maintnant je n'ai plus de pb de cast et mes objets on l'air d'être clonné correctement.

    j'ai toujours un problème mais cette fois c'est hibernate qui ne m'enregistre pas mes nouveaux objets clonnés. par hasard, auriez vous une idée.
    En fait une fois mon objet cloné, je met à null mon attribut Id (clé primaire) et j'enregistre mon objet.

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

Discussions similaires

  1. [CASTS]problème de cast de Time
    Par DeVoN dans le forum Langage
    Réponses: 7
    Dernier message: 22/02/2006, 18h24
  2. [JDBC Driver][JSTL] Problème de cast de données
    Par GyLes dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 27/09/2005, 11h00
  3. problème de cast!
    Par LaseLiep dans le forum Langage
    Réponses: 3
    Dernier message: 03/06/2005, 10h30
  4. Problème de cast/serialization/externalization ?
    Par Linlin dans le forum CORBA
    Réponses: 1
    Dernier message: 06/12/2004, 17h46
  5. [C#] Problème de casting de @IDENTITY
    Par bilb0t dans le forum Accès aux données
    Réponses: 7
    Dernier message: 03/09/2004, 10h42

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