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 :

[Debutant] clone d'une ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 80
    Points
    80
    Par défaut [Debutant] clone d'une ArrayList
    Bonjour les gens

    J'ai un probleme pour cloner une ArrayList.

    La ligne de code suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ((Courbe)o).listePoint = (ArrayList<PointMesure>)(this.listePoint.clone());
    Me provoque un warning à la compilation :


    courbe\Courbe.java:124: warning: [unchecked] unchecked cast
    found : java.lang.Object
    required: java.util.ArrayList<courbe.PointMesure>
    ((Courbe)o).listePoint = (ArrayList<PointMesure>)ob;
    ce que je comprend pas étant donné que je cast ma liste cloner...

    Pourriez vous eclairer ma lanterne?

    Merci
    Blaise

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le warning est normal puique ta méthode clone() renvoit un objet : rien ne garantit que l'objet retrouné est bien une ArrayList<PointMesure> (en particulier si tu hérite de ArrayList et que tu redéfinis cette méthode).

    Or l'utilisation des Generics te garantit l'absence totale de ClassCastException si la compilation s'effectue sans warning (et sans erreur bien sûr).

    Pour éviter ce warning tu peux utiliser l'annotation @SuppressWarning (attention il faut le JDK _05 ou _06 il me semble) pour ignorer ce warning, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        @SuppressWarnings("unchecked")
        public static <T> ArrayList<T> clone(ArrayList<T> list) {
            return (ArrayList<T>) list.clone();
        }
    Puis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Courbe)o).listePoint = clone(this.listePoint);
    Sinon tu peux tout simplement recréer une nouvelle ArrayList sans passer par le cloneage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Courbe)o).listePoint = new ArrayList<PointMesure>(this.listePoint);
    a++

  3. #3
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 80
    Points
    80
    Par défaut
    L'enuit du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Courbe)o).listePoint = new ArrayList<PointMesure>(this.listePoint);
    c'est que je me retrouve avec les references des objets contenuent dans ma listePoint, et que si je modifie la liste cloner, je modifie l'original également (me semble t'il)

    Le warning est normal puique ta méthode clone() renvoit un objet : rien ne garantit que l'objet retrouné est bien une ArrayList<PointMesure>.
    Justement, je recherche un moyen de caster l'objet retourné par clone() pour lui signifie que c'est une arraylist et qu'il arrete de m'enquiquiner avec ce warning (non mais!)

    Mais bon, je sens que je vais opter pour la méthode du @SuppressWarning.

    Merci

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par blaise_laporte
    c'est que je me retrouve avec les references des objets contenuent dans ma listePoint, et que si je modifie la liste cloner, je modifie l'original également (me semble t'il)
    Quelque soit la méthode (clone() ou création d'une nouvelle instance) :
    • Si tu ajoutes/supprimes des éléments de la liste, la liste original ne sera pas modifié (et vice/versa).
    • Si tu modifies des attributs des objets de la liste, les objets de la listes original seront aussi modifié (et vice/versa) puisque la méthode clone() ne copie pas les éléments de la liste mais seulement leurs références...
    a++

  5. #5
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 113
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par adiGuba
    Quelque soit la méthode (clone() ou création d'une nouvelle instance) :
    • Si tu ajoutes/supprimes des éléments de la liste, la liste original ne sera pas modifié (et vice/versa).
    • Si tu modifies des attributs des objets de la liste, les objets de la listes original seront aussi modifié (et vice/versa) puisque la méthode clone() ne copie pas les éléments de la liste mais seulement leurs références...
    a++
    en effet, j'ai pensé à remplacer tout les elements de ma nouvelle liste par des clones des elements de mon ancienne liste (Je crois qu'on appelle ça un clonage en profondeur?). Du coup, je peux parfaitement faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((Courbe)o).listePoint = new ArrayList<PointMesure>(this.listePoint);
    comme tu me l'a conseiller...

    J'suis bête

    Merci

Discussions similaires

  1. utilisation d une arrayList, debutant
    Par Mobistar dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 06/03/2008, 11h35
  2. [DEBUTANT] Peut-on initialiser une ArrayListe dés sa création?
    Par kayzra dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 09/03/2007, 07h57
  3. [debutant]renvoyer sur une jsp depuis une servlet
    Par omega dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 23/03/2004, 11h55
  4. [debutant]Chargement d'une image de mes documents
    Par reineville dans le forum C++Builder
    Réponses: 5
    Dernier message: 23/03/2004, 09h52
  5. [Debutant]contexte d'une Webapp servlet et jsp
    Par yahia dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 13/10/2003, 10h43

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