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 :

[Generics] Connaître la classe du paramètre


Sujet :

Java

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Par défaut [Generics] Connaître la classe du paramètre
    Bonjour,

    Je voudrais savoir s'il est possible, au sein d'une classe "paramétrée", de connaitre la classe "effective" du paramètre.

    Je m'explique. Prenons comme exemple la classe paramétrée suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class MaCollection<E> {
      // ...
    }
    Considérons que cette classe possède une méthode qui nécessite, dans son traitement, de connaitre le type constituant son paramètre (String dans l'exemple d'une instanciation new MaCollection<String>();). Est-ce possible ? Si oui, comment faire ?

    En jouant sur la réfléxivité, je ne trouve que E...

    Merci d'avance pour votre aide,

    Arnaud

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 6
    Par défaut
    tonparametre.getClass().getName();
    ou
    tonparametre.getClass().getSimpleName();

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 5
    Par défaut
    Ce n'est pas exactement ça le problème.

    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
    package test;
     
    import java.util.Date;
     
    public class MyCollection<E> {
     
    	public void printParameterType() {
    		// Affiche le type du paramètre E
    	}
     
    	public static void main(String args[]) {
    		MyCollection<Date> coll = new MyCollection<Date>();
    		coll.printParameterType(); // Doit afficher java.util.Date
    	}
     
    }
    En gros, c'est le contenu de cette méthode "printParameterType()" que je n'arrive pas à compléter.

    Je me disais qu'un E.class aurait pu, à l'exécution, me renvoyer le bon type du paramètre... Seulement ce n'est pas le cas : aucune méthode / attribut statique n'est appellable à partir de E...

    Je sèche.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 577
    Par défaut
    Ce n'est pas directement possible.
    Les Generics sont un outil compile-time pour aider à s'assurer qu'on garde des types cohérents.
    Après compilation, ils n'existent plus.

    Cela signifie MyCollection<E> n'a absolument aucun moyen de savoir à quoi correspond réellement E :
    - Avant compilation ça n'a pas de sens : le but est justement que E puisse être n'importe quoi
    - Après compilation, les Generics n'existent plus.

    Workaround :
    - La plupart du temps, s'en passer.
    - Sinon, passer la Class<E> en paramètre au constructeur de MyCollection, et la garder comme membre privé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class MyCollection<E> {
      private final Class<E> clazz;
     
      public MyCollection(Class<E> clazz) {
        this.clazz = clazz;
      }
     
      public Class<E> getParameterType() {
        return clazz;
      }
     
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1

Discussions similaires

  1. [Reflect] connaître la classe des éléments d'une collection
    Par El Saigneur dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 12/06/2007, 12h04
  2. [SOAP]Passage de classes en paramètre?
    Par Asmodean dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 25/04/2007, 16h41
  3. Connaître les classes définies dans un fichier
    Par Tournevyks dans le forum Langage
    Réponses: 2
    Dernier message: 16/10/2006, 16h21
  4. Passer une classe en paramètre
    Par Tex-Twil dans le forum C++
    Réponses: 17
    Dernier message: 30/11/2005, 20h00
  5. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41

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