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 ne peut-on pas instancier de tableau paramétré ?


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Points : 153
    Points
    153
    Par défaut Pourquoi ne peut-on pas instancier de tableau paramétré ?
    Bonjour,

    Sur la FAQ (http://java.developpez.com/faq/java/...ancier_tableau), on cite le problème suivant (en supposant que l'on puisse instancier un tableau paramétré):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    List<String>[] stringListArray = new List<String>[100]; // ERREUR
     
    Object[] simpleArray = stringListArray;
     
    simpleArray[0] = new ArrayList<Number>(); // OK ?!?!?
    mais ce problème existe déjà sans les générics:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    String [] s = new String [10];
     
    Object [] o = s;
     
    o[0] = new Object(); // OK??!!
    Le code précédent compile mais provoque l'erreur java.lang.ArrayStoreException

    Est-ce que j'ai mal compris l'exemple?
    Y-a-t-il d'autres raisons pour ne pas instancier de tableau paramétré?

    Merci de vos réponses.

  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 problème vient du fait qu'avec les types paramétrés il n'y a pas d'ArrayStoreException.

    Du fait de leur héritage particulier, les tableaux ne sont pas typesafe et peuvent donc générer des ArrayStoreException à l'exécution si les types ne sont pas compatible.


    Or toutes les vérifications des Generics sont effectué à la compilation et sont perdu à l'exécution, et le cumul Generics+tableau peut aboutir à des situation complètement incorrect

    Tu peux vérifier cela avec le code suivant (qui génère un warning préventif et aucune erreur à l'exécution) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	List<Number> list = new ArrayList<Number>();
    	list.add(15);
     
    	List<String>[] stringListArray = new List[100]; // WARNING
    	Object[] simpleArray = stringListArray;
    	simpleArray[0] = list; // OK à la compil et à l'execution !!!
    Comme le type Generics est perdu à l'exécution, cela revient en fait à mettre une ArrayList dans un tableau de List, ce qui est tout à fait légal du point de vue de l'exécution, et donc cela ne génère aucune exception.

    Or c'est totalement faux puisque qu'on met une List<Number> dans un tableau de List<String>... et cela provoquera donc une exception un peu plus loin si tu fais quelque chose comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String s = stringListArray[0].get(0);
    Le code semble tout à fait valable puisque tu tentes de récupérer une String depuis un List<String>[]... or tu accèdes en vérité à un List<Number> et donc à un Number ce qui génèrera une bien belle ClassCastException


    C'est plus clair ?

    a++

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Points : 153
    Points
    153
    Par défaut
    Oui, c'est beaucoup claire.

    Le fait qu'une partie de l'information soit perdue à run-time m'avait echapée. Tous les problèmes viennent de là.

    Merci beaucoup.

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

Discussions similaires

  1. [AC-2010] Pourquoi ne peut-on pas trier un sous état
    Par chelmi95 dans le forum IHM
    Réponses: 2
    Dernier message: 13/01/2016, 13h38
  2. Pourquoi ne peut on pas acc
    Par samlepirate dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/04/2011, 22h21
  3. Réponses: 11
    Dernier message: 15/09/2008, 10h25
  4. Réponses: 25
    Dernier message: 02/08/2008, 17h11

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