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 :
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
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; } ... }
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", String.class, "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() )
Code : Sélectionner tout - Visualiser dans une fenêtre à part Feature<String> f = new Feature<String>("KEY", "VALUE");
Si je fais :
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
1
2
3
4
5
6 public Feature(String key, T defaultValue) { this.key = propertyKey; this.type = defaultValue.getClass(); this.defaultValue = val; }
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 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part this.type = (Class<T>) defaultValue.getClass();
Oui mais comment le renvoyer par la methode getType() ?
En fait, je crois que je reverrai bien à un truc du genre :
La class Class<T> n'ayant pas de constructeur, je ne sais pas comment la récupérer.
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) { } ... }
Partager