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 :

Connaître le type d'un template


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut Connaître le type d'un template
    Bonjour

    Dans une classe template, j'ai besoin de connaitre le type du parametre template. La seule solution que j'ai trouvé actuellement est la suivante :

    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
    19
    20
    class Feature<T>
    {
        private final String key;
        private final Class<T> type;
        private final T defaultValue;
     
        public Feature(String key, Class<T> type, T defaultValue)
        {
            this.key = propertyKey;
            this.type = type;
            this.defaultValue = val;
        }
     
        Class<T> getType()
        {
            return this.type;
        }
     
        ...
    }
    qui n'est pas terrible : on duplique le type (a la définition, et à la l'instanciation) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feature<String> f = new Feature<String>("KEY", String.class, "VALUE");
    Alors que je préfererai un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Feature<String> f = new Feature<String>("KEY", "VALUE");
    Je suppose que l'on pourrait récupérer le type ou bien de la déclaration de la classe (un truc du genre T.getClass()), ou bien de la valeur defaultValue (defaultValue.getClass() )

    Si je fais :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        public Feature(String key, T defaultValue)
        {
            this.key = propertyKey;
            this.type = defaultValue.getClass();
            this.defaultValue = val;
        }
    J'ai une erreur de cast : getClass() renvoie un Class<?> et this.type est un Class<T>. Bon alors je pourrais caster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.type = (Class<T>) defaultValue.getClass();
    Plus j'avance, plus j'ai l'impression que ce que je fait ne sert à rien. Je l'ai le type : c'est Class<T>, non ?
    Oui mais comment le renvoyer par la methode getType() ?

    En fait, je crois que je reverrai bien à un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Feature<T>
    {
       public static final Class<T> TYPE = ...; // T.getClass()  ???
     
       public Feature(String key, T defaultValue)
       {
       }
     
       ...
    }
    La class Class<T> n'ayant pas de constructeur, je ne sais pas comment la récupérer.

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Il n'y a rien à y faire.

    Selon les règles de fiabilité des génériques, et du fait qu'ils n'existent que pour la compilation, pas au runtime, defaultValue.getClass(); n'est pas considéré assez fiable.
    Si tu es absolument certain que tout le code générique intervenant est sûr en termes de typage, tu peux forcer un cast vers Class<? extends T> (et non pas Class<T>) vu que dans ce cas, l'objet répond au générique en étant T lui-même ou un sous-type de T. En général, on préfère considérer qu'une telle certitude n'existe pas. D'où le warning.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    Architecte logiciel
    Inscrit en
    Janvier 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2006
    Messages : 28
    Par défaut
    La methode consistant a donner la classe par le constructeur est la meilleurs en terme de temps d'execution, le code est propre, malgres un besoin de legere repetition syntaxique.

    je ne te conseil pas d'utiliser la reflexion pour recuperer le type paramettré, même si c'est possible en respectant certaines limitations, car les valeurs des types parammetrés ne peuvent exister que pour des types concrets (sans parametre) étendant ou implementant des types parametrés *. Et tu expose les developpeurs a prendre ce probleme en considération pour utiliser ta classe.

    (* : c'est a dire : pour la class Toto<T> tu ne pourra recuperer la classe de T uniquement dans les cas suivant :
    • class Titi extends Toto<{Type que tu veux}>{...}
    • declaration de classe interne (nested class) style : x = new Toto<{Type que tu veux}>() {};


    si malgrès tout tu veux essayer, regarde la thread suivante :
    http://www.developpez.net/forums/d10...ument-methode/

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Merci pour les explications. Ca valait tout de même le coût de demander...

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 27/11/2008, 18h38
  2. Connaître le type du template
    Par Flo. dans le forum Langage
    Réponses: 13
    Dernier message: 20/02/2008, 04h26
  3. Connaître le type d'un champs d'une table Mysql
    Par xoran dans le forum Langage SQL
    Réponses: 1
    Dernier message: 20/07/2005, 09h29
  4. [POO] Comment connaître le type d'un objet
    Par zizou39 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/03/2005, 09h46
  5. [Access] Connaître le type de donnée
    Par Ric1983 dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/02/2005, 19h09

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