Partage
  • Partager sur Facebook
  • Partager sur Twitter

Type stocké dans une Collection

Sujet résolu
    15 février 2012 à 17:41:43

    Bonjour,

    j'aurais voulu savoir si il existait un moyen de récupérer le type d'objet contenu dans une collection ?

    Par exemple :

    List<String> -> type 'String'
    List<MonObjet> -> type 'MonObjet'

    A compter que ma collection est vide (objet Class<?> récupéré via l'API reflection).

    Des idées ?

    Cordialement.

    jusabatier
    • Partager sur Facebook
    • Partager sur Twitter
      15 février 2012 à 18:04:31

      D'accord mais dans ce cas comment font les EDI (et compil) pour refuser par exemple qu'on ajoute un Object dans une liste de String si cette liste est definie dans un jar (deja compilé) importé dans le projet ?

      Je ne sais pas si je suis très clair XD

      Exemple :

      liste.jar contient test/TestListClass.class

      TestListClass.class est généré à partir de ce code :


      public class TestListClass
      {
      	public List<String> liste;
      	
      	public TestListClass()
      	{
      		liste = new ArrayList<String>();
      	}
      }
      


      Si j'inclut ce jar à un projet et que je fais le code suivant :

      Object test = new Object();
      TestListClass testList = new TestListClass();		
      testList.liste.add(test);
      


      Le compilateur voit bien que ma liste exige une String (erreur ligne 3), pourtant mon fichier .class est déjà compilé.
      • Partager sur Facebook
      • Partager sur Twitter
        16 février 2012 à 0:31:27

        Et tu crois que le List<String> est là pour faire joli ?
        • Partager sur Facebook
        • Partager sur Twitter
        Je ne réponds pas aux MP techniques, les forums sont là pour ça / Danser le rock à Lille / BetaSeries
          16 février 2012 à 2:05:24

          Mon but est de recuperer le type d'objet contenu dans la liste à partir d'un Class<?> de cette liste :

          List<String> ls = new ArrayList<String>();
          Class<?> classe = ls.getClass();
          


          A partir de classe j'aurai voulu récupérer le type d'objet contenu dans la liste.
          • Partager sur Facebook
          • Partager sur Twitter
            17 février 2012 à 14:41:35

            Up, toujours pas d'idées ?
            • Partager sur Facebook
            • Partager sur Twitter
              17 février 2012 à 15:24:08

              Tu peux récupérer le premier élément et récupérer son type, mais dans le genre crade ça se pose un peu là.
              • Partager sur Facebook
              • Partager sur Twitter
                17 février 2012 à 15:28:58

                Ça, ça fonctionne :
                import java.util.*;
                import java.lang.reflect.*;
                
                public class Test
                {
                	private List<String> attribut;
                	
                	public static void main(String... args) throws Exception
                	{
                		Field attributField = Test.class.getDeclaredField("attribut");
                                ParameterizedType attributType = (ParameterizedType)attributField.getGenericType();
                                Class<?> attributClass = (Class<?>) attributType.getActualTypeArguments()[0];
                                System.out.println(attributClass); // class java.lang.String.		
                	}
                }
                


                Par contre ça :
                Collection<String> unObjet = new ArrayList<String>(1);
                ParameterizedType type = (ParameterizedType)unObjet.getClass();
                

                Ne fonctionne pas. J'ai du mal à piger pourquoi il faut nécessairement passer par l'objet Field. Y'a un truc que j'ai loupé quelque part.


                PS : je précise que je maîtrise pas du tout cette bidouille. J'aurais pensé que la présence de "type erasure" ne permettait pas de faire ce type de trucs.
                Donc en fait, ce que je suppose, c'est qu'en passant par un champ on "retrouve" sa déclaration générique, tandis qu'avec un objet "volatile" c'est pas possible puisque comme il a été mentionné, le mécanisme de type erasure "efface" la notion de type paramétré.
                Je laisse la place aux gens qui maîtrisent mieux le sujet pour t'expliquer ça.
                • Partager sur Facebook
                • Partager sur Twitter
                  17 février 2012 à 15:53:17

                  Le type erasure n'est pas appliqué partout de la même façon.

                  Ton deuxième exemple ne marche pas parce que l'information ne peut pas être retrouvée avec une simple référence, à cause du type erasure justement.

                  Par contre, le compilateur conserve l'information dans le bytecode pour les variables membres, les retours et les paramètres de fonction. C'est pour cette raison que ton premier exemple marche, et que le compilateur est capable de te rejeter si tu n'utilises pas le bon type paramétré bien que la classe utilisée soit déjà compilée et sans source accessible.

                  Pour la question de départ, c'est donc impossible si on ne possèdes qu'une référence.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 février 2012 à 15:58:51

                    Oui c'est ce que j'ai indiqué dans mon PS après y avoir réfléchi. La question de l'OP est intéressante.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 février 2012 à 12:38:45

                      Merci beaucoup Javier je vais tester ça mais d’après vos explication sa devrait marcher dans mon cas puisque j'analyse des fichiers .class pour faire de la retroconception UML.

                      Cordialement

                      jusabatier
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Type stocké dans une Collection

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown