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 :

Transformer une liste chainée en tableau


Sujet :

Collection et Stream Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut Transformer une liste chainée en tableau
    Bonjour à tous,


    J'aurais besoin, en java, de créer un tableau d'éléments dont le type est un générique.

    Mais... A cause du mécanisme d'effacement lors de la compilation, ce n'est pas possible.

    Pour éviter ce problème, j'ai vu que l'on peut utiliser la syntaxe : LinkedList<?>[] tableau = new LinkedList<?>[taille];

    Aucun détail n'était donné dans ce que j'ai trouvé.

    Quelqu'un connait il cet opérateur ? (est ce bien un opérateur ?)
    Comment faire, sachant que les éléments de tableau sont de type T, pour les caster en T de manière sécurisé ?


    Merci à tous pour vos réponses, qui seront précieuses !

    Tolliob

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    On ne peut pas. Si ce n'est pas possible ce n'est pas possible, il n'y a pas lieu de se demander comment le rendre possible.

    Cesse de vouloir un tableau de génériques. Utilise une liste de génériques ou un tableau de pas génériques, mais choisis.
    Dans certains cas imparfaits, tu pourras aussi vouloir utiliser un tableau de génériques dont l'accès n'est pas sûr.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

    Pour compléter les propos de thelvin :

    Citation Envoyé par tolliob Voir le message
    Quelqu'un connait il cet opérateur ? (est ce bien un opérateur ?)
    C'est un "wildcard", qui permet de restreindre le typeage Generics.
    Ici avec <?> tu indiques au compilateur que tu travailles avec un type paramétré que tu ne connais pas précisément...

    Citation Envoyé par tolliob Voir le message
    Comment faire, sachant que les éléments de tableau sont de type T, pour les caster en T de manière sécurisé ?
    Pour avoir quelque chose de sécurisé, il ne faut pas utiliser les tableaux car ils ne sont pas type-safe.
    Un code utilisant des tableaux peut compiler sans erreur tout en provoquant des exceptions à l'exécution...


    a++

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Merci à tous les deux pour vos réponses !

    Effectivement, une liste est utilisable dans mon cas.

    Tolliob

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Pour pallier ce soucis il suffit en fait passer en paramètre le type des objets contenus dans la liste. Quelque chose dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public static <T> T[] toArray(Class<T> type, List<T> list) {
      return list.toArray((T[]) Array.newInstance(type, list.size()));
    }
    L’implémentation de toArray(T[]) dans LinkedList appelle également Array.newInstance (avec le cast à T[]) quand on lui passe un tableau qui n'a pas la capacité suffisante pour stocker tous les éléments.
    Si tu es sur que tous tes éléments dans ta liste sont de même type, il suffit de récupérer la classe du premier élément de la liste.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    En l'occurrence, le type du tableau n'est pas un paramètre générique, mais un type paramétré générique.
    Dans ce cas, un tableau empêche de vérifier la cohérence de type, et si on renonce à la cohérence de type il n'y a pas lieu de vouloir utiliser le paramètre du type paramétré.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Je dois dire que certaine chose me dépassent...

    Qu'est ce qu'un paramètre générique ?

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Ca depend en fait ; dans un principe de fabrique comme celle de List<T>.toArray(T[]) ça a parfaitement son sens. Ensuite, dans des contextes où l'utilisation des collections n'est pas forcément recommandé (ex : espace mémoire restreint sur mobile ou embedded par exemple), ou même si on a besoin de performances*, l'utilisation des tableau est toujours recommandée.

    *Ce n'est pas pour rien que toutes les méthodes de travail de bas niveau en 2D utilisent des int[] pour gérer la couleur ou les buffers représentant le raster sur lequel dessiner.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par tolliob Voir le message
    Je dois dire que certaine chose me dépassent...

    Qu'est ce qu'un paramètre générique ?
    <T> est un paramètre générique.
    List<T> est un type paramétré, dont <T> est le paramètre générique.

    De ce que tu nous en as dit, tu ne cherches pas à faire des tableaux de T, mais des tableaux de List<T>.

    Citation Envoyé par bouye Voir le message
    Ca depend en fait ; dans un principe de fabrique comme celle de List<T>.toArray(T[]) ça a parfaitement son sens. Ensuite, dans des contextes où l'utilisation des collections n'est pas forcément recommandé (ex : espace mémoire restreint sur mobile ou embedded par exemple), ou même si on a besoin de performances*, l'utilisation des tableau est toujours recommandée.

    *Ce n'est pas pour rien que toutes les méthodes de travail de bas niveau en 2D utilisent des int[] pour gérer la couleur ou les buffers représentant le raster sur lequel dessiner.
    Qu'on en ait besoin à un moment ou à un autre pour pallier à certaines insuffisances, c'est une chose. C'est la réalité, on fait pas toujours ce qu'on veut. Dans le même genre, on peut jurer fidélité au typage statique fort, mais pour ranger des trucs en contexte J2EE on les met jamais que dans une Map<Object, Object>, parce qu'un type plus concret demanderait trop de travail d'intégration.

    Simplement, les génériques ça sert à vérifier la cohérence de type au moment de la compilation, et quand on les mixe avec des tableaux ils échouent dans ce rôle, et donc qu'ils soient là ou non c'est pareil.
    Ceci étant dit, ce n'est le cas qu'au cas où quelqu'un fasse "quelque chose de mal" avec les tableaux génériques. On peut décider de faire le vœu pieux que personne ne fera "quelque chose de mal" avec eux en le sachant ou non, et continuer à profiter des vérifications qui marchent encore.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Citation Envoyé par bouye Voir le message
    [...] sur mobile ou embedded [...]

    [...] travail de bas niveau en 2D
    [...] en contexte J2EE on les met jamais que dans une Map<Object, Object> [...]
    Ceci explique cela, nous n'avons pas les mêmes valeurs
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2014
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2014
    Messages : 39
    Points : 33
    Points
    33
    Par défaut
    Merci Thelvin pour ces précisions sur type paramètre et paramètre générique.

    Je reviens à ma question de base en la précisant...

    Je dispose de listes chainées dont le type des éléments est 'LinkedList<T>'. Ce type 'T' ne varie pas et peux donc être considéré comme un paramètre générique constant. Je souhaite transformer mes listes chainées en tableau, sachant que celles-ci représentent en fait une entité pour ce que je suis en train de faire.

    Que pensez vous du code suivant ? Quels sont les défauts que vous lui voyez ? Quelles sont les améliorations que l'on pourrait y porter.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    public class MonTypeDeBase {
    	private String maChaine;
     
    	// ...
    	// ...
    	// ...
    }
     
    public class MonTypeIntermediaire {
    	private LinkedList<MonTypeDeBase> liste;
     
    	// ...
    	// ...
    	// ...
    }
     
    public class MesListes {
    	private LinkedList<MonTypeIntermediaire> liste;
     
    	// ...
    	// ...
    	// ...
     
    	public MonTypeIntermediaire[] transforme() {
    		return (MonTypeIntermediaire[]) this.liste.toArray();
    	}
     
    	// ...
    	// ...
    	// ...
    }
    Encore merci pour toutes vos réponses,

  12. #12
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ben il a le problème qu'il marche pas et fait une belle ClassCastException.
    En effet this.liste.toArray(); renvoie un Object[], et tu peux toujours essayer de le caster, ça ne marchera pas car le tableau a bel et bien été créé avec un new Object[taille] et pas un new MonTypeIntermediaire[taille].
    Tu pourrais régler ça en faisant this.list.toArray(new MonTypeIntermediaire[this.list.size()]).

    Ceci étant dit, on continuera à se demander pourquoi tu veux toujours transformer en tableau et pas garder ce que tu as, des List.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/10/2013, 13h54
  2. Transformer une liste en un tableau
    Par Okeano dans le forum Collection et Stream
    Réponses: 14
    Dernier message: 23/04/2010, 10h43
  3. transformer une liste en chaine de caractères
    Par fboss dans le forum Général Python
    Réponses: 8
    Dernier message: 24/11/2009, 19h07
  4. Transformer une liste en tableau
    Par basket dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/09/2006, 16h01
  5. Transformer une liste en chaîne de caractères
    Par nounjours dans le forum Prolog
    Réponses: 1
    Dernier message: 23/02/2006, 15h41

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