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 :

introspection & généricité


Sujet :

Langage Java

  1. #1
    Membre averti Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Points : 414
    Points
    414
    Par défaut introspection & généricité
    Bonjour,

    Je me pose une petite question concernant la généricité.
    Dans le cas de la déclaration suivante :

    public class ClassGeneric<T, U>
    {
    // etc...
    }

    ClassGeneric<Integer, String> gen = new ClassGeneric<Integer, String>();

    comment peut-on savoir par introspection que la classe de l'objet gen est générique est qu'elle utilise pour paramètres : T = Integer, U = String ??
    auteur de Awl (http://awl-wizard.sourceforge.net), librairie de développement d'assistant en Java.
    auteur de Blackdog (http://www.blackdog-project.org), lecteur/gestionnaire audio en Java.

  2. #2
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    C'est dans la doc... methode Class.getTypeParameters()
    Romain Guy
    Android - Mon livre - Mon blog

  3. #3
    Membre averti Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Points : 414
    Points
    414
    Par défaut
    désolé, c'est pas aussi clair pour moi

    j'ai cette classe :

    public class ClassGeneric<T extends String, U>
    {

    }

    je crée cet objet :
    ClassGeneric<String, Integer> m = new ClassGeneric<String, Integer>();

    et par introspection sur sa classe, je trouve bien 2 TypeVariables :

    Pour le premier TypeVariable,
    [0] bounds[0] : class java.lang.String
    [0] name : T

    et pour le deuxième,
    [1] bounds [0] : class java.lang.Object
    [1] name : U

    Donc, a priori, je récupère des infos sur la classe générique ( normal!! ). ce que je souhaiterais récupérer, ce sont les types avec lesquels la classe générique a été instanciés ( String & Integer )...
    auteur de Awl (http://awl-wizard.sourceforge.net), librairie de développement d'assistant en Java.
    auteur de Blackdog (http://www.blackdog-project.org), lecteur/gestionnaire audio en Java.

  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,

    Citation Envoyé par xixi31
    Donc, a priori, je récupère des infos sur la classe générique ( normal!! ). ce que je souhaiterais récupérer, ce sont les types avec lesquels la classe générique a été instanciés ( String & Integer )...
    C'est normal puisque la vérification des types générics est effectué à la compilation, et perdu à l'exécution afin de conserver une compatibilité asendante...

    Donc ce n'est pas possible...

    Pourquoi as-tu besoin de cette information ?

    a++

    PS : remarques : <T extends String> ne sers à rien puisque String est final et ne peux donc pas avoir de classe fille...

  5. #5
    Gfx
    Gfx est déconnecté
    Expert éminent
    Avatar de Gfx
    Inscrit en
    Mai 2005
    Messages
    1 770
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 770
    Points : 8 178
    Points
    8 178
    Par défaut
    C'est tout a fait normal. Que tu ecrives ClassGeneric<String, Integer> ou ClassGeneric<String, Date>, la classe est toujours ClassGeneric<T extends String, U> (au passage, T extends String n'a aucun sens car la classe String est final et on ne peut donc pas en heriter, tu n'as donc pas besoin du type generique T). Le resultat que tu obtiens est donc tout a fait coherent.

    Essaye de definir public class ClassGeneric<T, U extends List> et les TypeVariable te donneront Object et List.

    Encore une fois, lis la doc. Dans la doc de la methode getBounds() tu peux lire :

    Returns an array of Type objects representing the upper bound(s) of this type variable.
    L'upper bound en question est donc Object quand tu marque juste <T>, String quand tu marques <T extends String>, List quand tu marques <T extends List>, etc.

    Rappelle-toi enfin que les generics en Java reposent sur la notion d'erasure. Apres compilation, le type est "perdu" est tout est ramene a Object. Le compilateur s'occupe s'implement de faire des verifications et de rajouter des casts pour toi (en gros).
    Romain Guy
    Android - Mon livre - Mon blog

  6. #6
    Membre averti Avatar de xixi31
    Inscrit en
    Juin 2005
    Messages
    423
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2005
    Messages : 423
    Points : 414
    Points
    414
    Par défaut
    le "extends String" était un très mauvais exemple

    Merci de cette réponse collégiale, c'est beaucoup plus clair
    auteur de Awl (http://awl-wizard.sourceforge.net), librairie de développement d'assistant en Java.
    auteur de Blackdog (http://www.blackdog-project.org), lecteur/gestionnaire audio en Java.

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

Discussions similaires

  1. Introspection et Généricité
    Par LittleBean dans le forum Langage
    Réponses: 3
    Dernier message: 04/06/2009, 10h46
  2. Généricité, héritage et Reflexion/introspection
    Par K-Kaï dans le forum Langage
    Réponses: 3
    Dernier message: 26/02/2009, 14h27
  3. [architecture] pour de la généricité, vous feriez quoi ?
    Par Alec6 dans le forum Débats sur le développement - Le Best Of
    Réponses: 39
    Dernier message: 03/07/2006, 14h39
  4. [JNDI] [LDAP] [DirContext] [LdapContext] DN / introspection
    Par wazup dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 09/04/2004, 15h16

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