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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
template<class T> T getValue(string key) { return (T) uneFonctionQuiConvertieStringEnDouble(getProperty(key));}
Maintenant en java :
1) Je ne peut pas faire :
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));
	}
FAIL : java.lang.Double cannot be cast to java.lang.Float
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 :
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)));
	}
Échoue pareille : FAIL : java.lang.Double cannot be cast to java.lang.Float

4) la seule solution que j'ai trouvé ressemble à ça
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");
	}
Si vous avez des idées / remarques je suis preneur car mon code ne me plaît pas

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>