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

Langage Java Discussion :

Récupérer la classe d'un type générique


Sujet :

Langage Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut Récupérer la classe d'un type générique
    Bonjour,

    J'aimerai savoir comment récupérer la classe d'un type générique.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<Integer> l = new ArrayList<Integer>();
    Class c = ...???
    if (c instanceof Integer) System.out.println("gagné!")
    Comment trouver c?

    Merci d'avance

  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,


    Ce n'est pas possible... ou pas tout à fait pour être précis.

    Il n'est pas possible de récupérer le type Generics d'une instance quelconque comme cela.

    Par contre tu peux récupérer le type Generics déclaré d'un attribut de classe via la reflection, ou dans le cas d'un héritage spécifique (exemple class IntList extends ArrayList<Integer>)


    Mais une question : pourquoi as-tu besoin de cela exactement ?

    a++

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Les types génériques sont présents uniquement à la compilation.

    Tu dois trouver une autre option, comme par exemple remplir ta liste avec au moins un élément, puis effectuer l'action suivante : maListe.get(0).getClass();

  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
    Citation Envoyé par dingoth Voir le message
    Tu dois trouver une autre option, comme par exemple remplir ta liste avec au moins un élément, puis effectuer l'action suivante : maListe.get(0).getClass();
    Attention cela n'est pas forcément vrai : On peut très bien avoir un type différent que celui déclaré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<Number> list = new ArrayList<Number>();
     
    list.add(new Integer(0));
    list.add(new Double(0.0));
    a++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Points : 57
    Points
    57
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Mais une question : pourquoi as-tu besoin de cela exactement ?

    a++
    Je travaille sur un petit générateur de code java, où je peux définir des méthodes et spécifier leurs paramètres et/ou classe de retour. En gros, j'ai un objet Functionality qui a un champ : Class returnType.

    Si je sais faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    func.setReturnType(List.class)
    une fois la génération lancée, mon code généré définira méthode qui retourne "List", ce qui causera un type safety warning.

    Je cherchais donc à voir comment je pouvais faire pour aller plus loin, éviter de devoir ajouter systématiquement @SuppressWarnings("unchecked"), et savoir générer par exemple "List<Integer>" comme retour. Je me disais qu'en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    func.setReturnType(new ArrayList<Integer>().class)
    je pourrais trouver un moyen de retrouver "Integer"


    Enfin voilà pour mes intentions, je ne sais pas si c'est clair

  6. #6
    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
    Citation Envoyé par Asterius Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    func.setReturnType(new ArrayList<Integer>().class)
    Cela te retourne ArrayList et non pas ArrayList<Integer>...


    Citation Envoyé par Asterius Voir le message
    Je travaille sur un petit générateur de code java, où je peux définir des méthodes et spécifier leurs paramètres et/ou classe de retour. En gros, j'ai un objet Functionality qui a un champ : Class returnType.
    Tu travailles à partir de quoi ? Du code source ?
    Dans ce cas tu devrais pouvoir récupérer le type en analysant le source ! Non ?

    a++

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Août 2005
    Messages : 6 854
    Points : 22 878
    Points
    22 878
    Billets dans le blog
    51
    Par défaut
    A part le stocker dans l'objet...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Class Toto<T> {
      private Class<T> type;
     
      public Toto(Class<T> type) {
        this.type = type;
      }
     
      public class<T> getType() {
        return type;
      }
    }

  8. #8
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Points : 9 529
    Points
    9 529
    Billets dans le blog
    1
    Par défaut
    Suggestion :

    Dans la mesure où tu fais un générateur de code source java, tu peux tout aussi bien utiliser une chaine String pour spécifier le type de retour.
    S'il s'agit de faire un contrôle de cohérence, tu peux toujours analyser les éléments et passer par un Class.forName(String) pour vérifier l'existence.
    Maintenant, tu pourrais aussi laisser le compilateur faire ce boulot... imagine que tu utilises un type d'une classe que tu es entrain de générer, problème

    A+

Discussions similaires

  1. Appel de '.class' sur un type générique
    Par acarbenay dans le forum Langage
    Réponses: 2
    Dernier message: 18/10/2011, 15h10
  2. Types génériques: Class is a raw type
    Par lexsteens dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 22/03/2008, 04h40
  3. Récupérer objets d'un même type dans une classe
    Par Madfrix dans le forum Langage
    Réponses: 12
    Dernier message: 19/02/2008, 13h17
  4. Réponses: 4
    Dernier message: 30/01/2008, 14h45
  5. [RequestProcessor] récupérer la classe action type
    Par sylvainv18 dans le forum Struts 1
    Réponses: 4
    Dernier message: 02/11/2006, 14h45

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