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:
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:
Feature<String> f = new Feature<String>("KEY", String.class, "VALUE");
Alors que je préfererai un truc du genre :
Code:
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:
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:
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:
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.