Bonjour à tous,
Les casts et les fonctions génériques sont le sujet de beaucoup de question et mal-grès tous les posts que j'ai pu lire sur le sujet je n'arrive pas à savoir si ma solution est la plus propre (honnêtement j’espère pas, car je la trouve sale)
Mon problème :
Je stock mes constants dans un fichier .properties que je lis avec un Properties. Jusque la rien de fou. Mais getProperty(key) retourne un string et j'aimerais créer un classe "MesProperties" qui ne retourne pas forcement un string.
En C++ j'aurais écris quelque chose comme ça :
Maintenant en java :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 template<class T> T getValue(string key) { return (T) uneFonctionQuiConvertieStringEnDouble(getProperty(key));}
1) Je ne peut pas faire :
FAIL : java.lang.Double cannot be cast to java.lang.Float
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public <T> T getValue(final String key){ return (T)Double.valueOf(prop.getProperty(key)); }
2) Je ne peut pas faire un truc du genre T.valueOf(..) parce que on peut pas utiliser de static sur un generic.
3) Un truc du genre :
Échoue pareille : FAIL : java.lang.Double cannot be cast to java.lang.Float
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public <T> T getValue(final String key,Class<T> clazz){ return clazz.cast(Double.valueOf(prop.getProperty(key))); }
4) la seule solution que j'ai trouvé ressemble à ça
Si vous avez des idées / remarques je suis preneur car mon code ne me plaît pas
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
21
22
23
24 @SuppressWarnings("unchecked") public <T> T getValue(final String key,Class<T> clazz){ if (clazz.equals(String.class)) { return (T)(prop.getProperty(key)); } else if(clazz.equals(Boolean.class)) { return (T)(Boolean.valueOf(prop.getProperty(key))); } else if (clazz.equals(Float.class)) { return (T)(Float.valueOf(prop.getProperty(key))); } else if (clazz.equals(Double.class)) { return (T)(Double.valueOf(prop.getProperty(key))); } else if (clazz.equals(Integer.class)) { return (T)(Integer.valueOf(prop.getProperty(key))); } throw new IllegalArgumentException(clazz+" n'est pas pris en compte, sorry"); }
TL;DR
Je sais faire une conversion de Double vers Float mais je ne sais pas faire une conversion de Double vers <N extends Numbers>
Partager