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

Java Discussion :

Tableau de Vecteurs


Sujet :

Java

  1. #1
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut Tableau de Vecteurs
    Bonjour,

    j'essaye le code suivant (Component est une classe que je développe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vector<Component>[] ckf = new Vector<Component>[n];
    javac me lance alors directement une erreur de compilation : "generic array creation" et refuse de compiler la suite.

    Si j'essaye le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vector<Component>[] ckf = new Vector[n];
    le compilateur fait la compilation mais me lance le warning suivant :
    found : java.util.Vector[]
    required: java.util.Vector<Component>[]

    Comment instancier correctement un tableau de Vector typé ? Comment ne plus générer ce warning ?
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

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

    de part la nature fondamentalement contradictoire des génériques et des tableaux, c'est impossible. En tout cas impossible de le faire correctement.
    En gros tu demandes comment faire correctement une vérification de type qu'il est impossible de vérifier. On ne peut pas correctement faire quelque chose d'impossible.

    Le plus simple est d'utiliser une ArrayList à la place d'un tableau. (ArrayList accepte ce problème de part le fait qu'elle prend elle-même les mesures pour assurer ce qui ne peut pas l'être par le compilateur. Elle reconnaît les warnings comme étant légitimes et gérés à la place par son propre fonctionnement.)

    Et pendant qu'on y est, Vector est une classe obsolète. Lui-même devrait probablement être remplacé par ArrayList. A moins que sa nature synchronisée te soit effectivement nécessaire, auquel cas il faut quelque chose comme Collections.synchronizedList() sur une ArrayList.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut
    Le projet sur lequel je travaille, AnAcondA, a près de 20 ans d'âge. C'est pourquoi on peut y retrouver des classes comme Vector. J'ai une classe où il y a des tableaux à trois dimensions de Vector. Je ne vois pas par quoi je vais pouvoir remplacer ces Vector[][][] . J'ai essayé de travailler en construisant une ArrayList<Vector<Component>> puis de faire un toArray pour construire ma classe de tableau de Vector mais il me lance une ClassCastException à l'exécution. Je ne sais vraiment pas quoi faire.

    Pour ce qui est de remplacer les Vector par des ArrayList, effectivement je n'ai pas besoin d'avoir des listes synchronisées mais je cherche des listes les plus simples possibles et à l'époque Vector m'était apparu comme le choix idéal. ArrayList a-t-il une strucure simple de liste chaînée ou est il une succession de tableaux d'éléments ? Y a-t-il un Vector non synchronisé et non obsolète ?
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  4. #4
    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
    Bah remplace rien, utilise des Vector[][][] tel que, en raw type donc sans générique.

    Normalement il faut pas faire ça, mais là tu nous dis que c'est ton anaconda qui le fait, donc pas trop le choix.

    Et Vector et ArrayList, en structure c'est essentiellement la même chose : un tableau encapsulé dans une implémentation de List qui stocke ses éléments dans le tableau, mémorise combien d'éléments il y a dedans, et redimensionne le tableau quand il n'est plus assez grand.

    La différence est que Vector est sychronisé ce qui fait perdre des performances pour rien, et propose tout un ensemble de méthodes pas super bien choisies, avantageusement remplacées par celles de List.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut
    Le truc qui m'étonne est que l'on puisse déclarer un tableau de Vector typé mais qu'on ne peut pas l'instancier correctement. Cela me semble contradictoire.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  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
    Boaf non. On va pas faire chier tout le monde en le rendant 100% impossible à déclarer. Certes on peut pas initialiser le tableau correctement, mais on peut le faire à la nimp'.

    A la rigueur ça pourrait être une idée de faire un warning systématique sur les tableaux de génériques comme on en a pour les types génériques raw. Je suppose que c'est pas le cas parce qu'il y a genre une espèce d'effort de typage quand on fait ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut
    J'ai tenté une combine avec des ArrayList :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      private Vector<Component>[] construct(int n) {
        ArrayList<Vector<Component>> a = new ArrayList<Vector<Component>>(n);
        return (Vector<Component>[])a.toArray(); // erreur de cast !?
      }
    Mais ça génère une ClassCastException à l'exécution. Je ne vois pas mon erreur.

    De manière plus générale, je ne comprends pas pourquoi l'instanciation de Vector<MonType>[] est interdite.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  8. #8
    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
    Ton erreur, c'est que tu fais pas ce que je te dis.

    Mais bon, en gros, toArray() ne renvoie que des Object[]. Tu ne peux donc pas le caster en QuoiQueCeSoitDAutre[].
    Autrement dit, tu croyais que toArray() était un genre de truc qui était là justement pour résoudre ton problème, franchement pourquoi je te l'avais pas dit, hein ? Sauf que non, toArray() est là pour exporter le contenu d'une Collection dans un tableau, des fois que rien que ça ça puisse être utile, mais ça fait rien de plus. On a jamais dit que le type du tableau serait intéressant.

    De manière plus générale, je ne comprends pas pourquoi l'instanciation de Vector<MonType>[] est interdite.
    Parce que "instantiation de Vector<MonType>[]" ça n'a aucun sens.
    L'idée semble être d'instancier un objet de type tableau, d'une part, et d'utiliser les génériques c'est à dire leur fonction de vérification de typage, d'autre part.
    Ces deux objectifs se contredisent l'un l'autre, et l'idée n'a donc aucun sens.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut
    J'ai trouvé une solution fonctionnelle sur le site : https://programming.guide/java/gener...-creation.html
    Le workaround n°3 fonctionne très bien. Pas d'erreur de compilation, pas de warning, pas d'erreur d'exécution. Tout parfait !
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  10. #10
    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
    Le workaround numéro 3 appliqué à une collection est horrible. Mais d'un autre côté utiliser des Vector aussi, donc bon...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut
    Mais ça marche aussi avec des tableaux d'ArrayList ! Moi ça me convient. Promis je vais remplacer mes Vector par des ArrayList.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  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
    J'ai pas dit que ça marche pas, j'ai dit que c'est horrible.

    Au bout d'un moment, pourquoi faire ça quand tu pourrais faire un SuppressWarning ? 'Fin bon... On doit tous prendre notre temps d'apprendre. C'est une situation compliquée.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut
    Parce que les warnings, je veux les voir, tous ! Et je ne veux plus en voir aucun, je veux tous les corriger.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  14. #14
    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
    Mais oui mais là un warning serait tout autant mérité pour les mêmes raisons, c'est juste que tu as mis le compilateur dans une situation où il se sent forcé d'accepter que ce que tu demandes est légitime.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut
    Certes, mais il ne m'embête plus avec ça, en tout cas. C'est tout ce qui m'importe.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  16. #16
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut
    En parlant de types obsolètes comme Vector, Hashtable est-il obsolète ? Si oui, par quoi faut-il le remplacer ?
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

  17. #17
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par anadoncamille Voir le message
    En parlant de types obsolètes comme Vector, Hashtable est-il obsolète ? Si oui, par quoi faut-il le remplacer ?
    suggestion: lire la doc de HashTable pour voir les différences avec HashMap
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  18. #18
    Membre averti
    Avatar de anadoncamille
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2007
    Messages
    395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 395
    Points : 310
    Points
    310
    Billets dans le blog
    1
    Par défaut
    Merci, je vais utiliser HashMap à la place de HashTable, je n'ai pas besoin de synchronisation dans mon programme.
    __________________________________
    | +
    | Sylvain Tournois - Création logicielle
    |
    | sylv.tournois.free.fr
    |

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

Discussions similaires

  1. [FORMS 6i] Tableau et vecteur
    Par kikouu dans le forum Forms
    Réponses: 4
    Dernier message: 09/04/2008, 18h55
  2. Tri Tableau Matrice vecteur
    Par french_aspi dans le forum MATLAB
    Réponses: 9
    Dernier message: 24/03/2008, 14h50
  3. Tableau de vecteur
    Par romanegr dans le forum C++
    Réponses: 6
    Dernier message: 19/12/2007, 11h30
  4. Création d'un tableau de Vecteur de String
    Par Claythest dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 29/11/2006, 17h43
  5. tableau de vecteurs
    Par foxdie dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 01/05/2006, 18h58

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