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.