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 :

Java 5.0, les templates et les arrays


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut Java 5.0, les templates et les arrays
    Bonjour à tous. Voilà j'aimerai pouvoir creer un tableau de classe presentant un template de cette façon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BinaryNode<E>[] path_temp = new BinaryNode<E>[al.size()];
    Mais j'ai une erreur:

    Cannot create a generic array of BinaryNode<E>


    Par simple curiosité, pourquoi? Et comment y remedier?
    Merci ;-)

  2. #2
    Membre actif Avatar de xxaragornxx
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 241
    Points : 253
    Points
    253
    Par défaut
    Bonjour,
    Les generics ne sont que pour les Collections (et les retours de méthodes). Ca servirait à quoi sur un tableau vu que c'est déjà typé ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    Euuuh justement je developpe un arbre binaire pour l'indexation de données, et ces données peuvent etres de tout type.
    Chaque arbre doit donc pouvoir etre crée avec tout type de données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class BinaryNode<E> {
     
    private BinaryNode<E> parent;
    private BinaryNode<E>[] nodes; //0 = gauche, 1 = left
    private E data;
     
    //...
     
    }
    Dans la methode que je crée, j'aimerai recuperer le path vers le noeud de l'arbre:
    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
     
     
    public BinaryNode<E>[] getPath()
    	{
    		ArrayList<BinaryNode<E>> al = new ArrayList<BinaryNode<E>>();
     
    		BinaryNode<E> actual_node = this;
     
    		//Retro-propagation du path
    		while(actual_node.parent!=null)
    		{
    			al.add(actual_node);
    			actual_node = actual_node.parent; 
    		}
     
    		BinaryNode<E>[] path_temp = new BinaryNode<E>[al.size()]; // ne veut pas compiler
     
    	}
    Donc ici les generiques (c'est le terme voulant dire templates?) me semble tout a fait approprié a ce que je veux faire

    Est-ce impossible?

  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,



    Les Generics ne fonctionnent pas de la même manière que les Templates du C++ !

    En effet les types paramétrées avec les Generics sont perdu à l'exécution, et cela peut poser des problème avec les tableaux dans certain cas. C'est pourquoi la création de tableau avec les Generics est bloqué car cela pourrait induire en erreur (le code n'est pas sécurisé).

    Les tableaux héritent entre eux, ainsi un tableau BinaryNode<String>[] hérite de Object[], ce qui fait que si le compilateur ne bloquait pas la création de tableau générics, tu pourrais avoir le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BinaryNode<String>[] path_temp = new BinaryNode<String>[al.size()];
     
    // ...
     
    Object[] temp = path_temp;
    temp[0] = new BinaryNode<Integer>();
    Ce code ne génère aucune erreur ni warning à la compilation ni à l'exécution, alors que tu te retrouve avec un BinaryNode<Integer> dans un tableau de BinaryNode<String>.

    Le problème c'est que lorsque tu entreras le code suivant (où getValue() retournerait le type pramétré <E>) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String string = path_temp[0].getValue();
    Tu te retrouvera avec une ClassCastException puisqu'il contient un Integer et non pas une String...

    Et dans un grand application l'origine du problème peut être très dur à retrouver puisque l'exception ne survient pas à l'origine du problème...

    Je ne sais pas si je suis clair...
    Plus généralement la plupart des warnings et erreurs avec les générics indiquent que cela peut engendrer des ClassCastException "incohérent" et difficile à débugger...




    Si tu veux conserver un code sécurisé au maximum il vaut mieux renvoyer une List<E> plutot qu'un tableau...

    Maintenant si tu es sûr de toi et que tu veux renvoyer un tableau, il suffit de ne pas déclarer de type générics sur la création du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public BinaryNode<E>[] getPath() {
          // ...
          BinaryNode<E>[] path_temp = new BinaryNode[al.size()];
    }
    Tu aura alors un simple warning indiquant que la conversion n'est pas sécurisé, que tu peux eventuellement supprimer avec l'annotation @SuppressWarnings("unchecked") devant la méthode...

    a++

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    Tu a été on ne peu plus clair!!! (En fait j'ai tout compris )

    Je te remercie beaucoup!

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

Discussions similaires

  1. [Xtext] Problème avec les templates pour les mots clé
    Par P1t0u dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 10/06/2010, 15h53
  2. les classes et les templates dans les plugins
    Par asoka13 dans le forum C++
    Réponses: 22
    Dernier message: 24/01/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