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 :

Pourquoi je n'arrive pas à utiliser ArrayList<MyObj>.toArray() ?


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut Pourquoi je n'arrive pas à utiliser ArrayList<MyObj>.toArray() ?
    Bonjour,

    je reprend un module sur le quel j'avais bossé il y'a quelques temps, et qui sauf délire de me part, marchait sans problème.

    Aujourd'hui, je me retrouve à l'execution avec un tat de classCastException qui arrive lorsque j'effectue quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ArrayList<MonObj> list = remplireMaList(); 
    MonObj[] tab = (MonObj[] ) list.toArray();
    L'exception remontée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [pack1.MonObj;
    Alors je peux modifier le coee pour avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObj[] tab = (MonObj[] ) list.toArray(new MonObj[0]);
    Et la ca marche. Mais c'est juste un peu pourrie comme code

    Bon MonObj est une classe créé via CORBA, mais ca étend quand même d'Object. Sachant que je bosse sous Netbeans avec du java 1.6, est ce que vous avez une idée d'où peut venir ce problème ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,
    le cast n'est pas nécessaire dans le deuxième cas, voir )]la javadoc.
    Le premier code compile chez moi, si bien sûr dans ton ArrayList, tu as uniquement des objets de type MonObj... Le problème doit être autre, sur quelle ligne exactement as tu l'erreur ? Ceci dit je préfèrerais la deuxième, sans cast, car à mon sens plus sûre niveau typage et vérification par le compilateur.

    A plus

  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 133
    Points : 149
    Points
    149
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObj[] tab = (MonObj[] ) list.toArray();
    Une exception est genérée parce que tu essaies de caster l'objet renvoyé par list.toArray() en MonObj[], alors que list.toArray() renvoie Object[].

    Or, MonObj[] n'est pas une sous-classe de Object[].

    En précisant l'objet dans lequel tu castes en paramètre de toArray(), tu évites ce problème en précisant plus fortement le type de tableau renvoyé.

    Par contre, il n'est pas nécessaire de caster en MonObj[] si je ne me trompe pas. A vérifier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObj[] tab = list.toArray(new MonObj[0]);

  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
    Salut,

    Citation Envoyé par Djobird Voir le message
    je reprend un module sur le quel j'avais bossé il y'a quelques temps, et qui sauf délire de me part, marchait sans problème.

    Aujourd'hui, je me retrouve à l'execution avec un tat de classCastException qui arrive lorsque j'effectue quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ArrayList<MonObj> list = remplireMaList(); 
    MonObj[] tab = (MonObj[] ) list.toArray();
    Désolé pour toi, mais c'est surement un délire de ta part !
    Ce genre de code compile sans erreur mais produira toujours un ClassCastException car toArray() renvoi obligatoirement un Object[] qui n'est donc pas castable en MonObj[]...

    D'ailleurs la présence du cast dans un code utilisant des Generics signale un problème potentiel !


    Comme tu l'as dit, la solution est de passer par la classe toArray(array) qui permet d'utiliser un tableau du type souhaité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MonObj[] tab = list.toArray(new MonObj[list.size()]);

    a++

  5. #5
    Membre averti
    Inscrit en
    Juin 2006
    Messages
    570
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 570
    Points : 340
    Points
    340
    Par défaut
    Rah mais quel con, j'ai complètement inversé les logique de castage.

    Merci bien pour ces infos ^^

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Djobird Voir le message
    Rah mais quel con, j'ai complètement inversé les logique de castage.

    Merci bien pour ces infos ^^
    J'ai parlé trop vite : chez moi ça compile mais ça crash au runtime (et c'est normal ). Il faut que jer evoie comment j'ai configuré mon eclipse...

    Merci adiGuba

  7. #7
    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 George7 Voir le message
    Il faut que jer evoie comment j'ai configuré mon eclipse...
    Cela n'a rien à voir avec eclipse ou le compilateur ! Ce comportement est tout à fait normal.


    Lorsque tu fais un cast, tu indiques au compilateur que tu sais ce que tu fais, et que tu prend en charge les possibles erreurs d'exécutions.

    Le compilateur ne peut t'avertir que des cast complètement erroné... mais dans ce cas le cast reste possible selon l'implémentation de la méthode toArray()...


    Il faut bien prendre conscience que même si un cast compile sans erreur, cela peut engendrer une ClassCastException à l'exécution...

    Les Generics sont justement là pour éviter au maximum les casts, et donc éviter les erreurs à l'exécution en les détectant dès la compilation.


    a++

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Cela n'a rien à voir avec eclipse ou le compilateur ! Ce comportement est tout à fait normal.


    Lorsque tu fais un cast, tu indiques au compilateur que tu sais ce que tu fais, et que tu prend en charge les possibles erreurs d'exécutions.

    Le compilateur ne peut t'avertir que des cast complètement erroné... mais dans ce cas le cast reste possible selon l'implémentation de la méthode toArray()...


    Il faut bien prendre conscience que même si un cast compile sans erreur, cela peut engendrer une ClassCastException à l'exécution...

    Les Generics sont justement là pour éviter au maximum les casts, et donc éviter les erreurs à l'exécution en les détectant dès la compilation.


    a++
    ouais tout ça je sais, mais je réfléchissais au fait que par exemple Object[] -> String[] n'est pas complètement impossible, suivant comme tu as dit l'implémentation de toArray. J'ai eu un doute en lisant :

    Une exception est genérée parce que tu essaies de caster l'objet renvoyé par list.toArray() en MonObj[], alors que list.toArray() renvoie Object[].

    Or, MonObj[] n'est pas une sous-classe de Object[].
    que j'avais mal interprété et je me suis donc interrogé sur ma configuration

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

Discussions similaires

  1. Pourquoi je ne peux pas utiliser ArrayList ?
    Par gamisne dans le forum C#
    Réponses: 3
    Dernier message: 14/08/2008, 17h59
  2. [Erreur de syntaxe] Pourquoi je n'arrive pas a creer une table
    Par pierrot10 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/09/2006, 22h37
  3. [Oracle/ASP.Net] Pourquoi je n'arrive pas à charger oci.dll ?
    Par zakaria_jd dans le forum Accès aux données
    Réponses: 1
    Dernier message: 01/08/2006, 12h25
  4. [C# 2005 Express] Pourquoi je n'arrive pas à l'installer ?
    Par Pierre8r dans le forum Visual Studio
    Réponses: 2
    Dernier message: 30/07/2006, 15h49
  5. Réponses: 4
    Dernier message: 22/05/2006, 11h46

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