Salut,

Envoyé par
dobfatch
Mais comme rien de tout ça ne marche, j'ai opté pour une magouille (que je ne divulguerai pas ici pour ne choquer personne, déjà que javac se plaint ...).
Moi moi moi ! J'veux la voir cette magouille

Envoyé par
dobfatch
Donc est-ce que quelqu'un dans l'assistance verrait une solution à ceci, ou tout au moins, existe-t-il une explication logique au fait que ce ne serait pas possible ?
La réponse est toute simple : le typage des Generics est perdu à la compilation et n'est donc plus disponible pendant l'exécution du programme (impossible donc de savoir quel est le type à instancié).
Pour plus d'info : Les Generics ne sont pas des Templates comme les autres !
Ainsi que les différents articles sur les Generics :
La seule solution à ma connaissance est de se trimballer le type réel dans la classe par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class Foo<Z extends Bar> {
/** On conserve le type en attribut */
private final Class<Z> type;
/** Le constructeur a obligatoirement besoin du type. */
public Foo(Class<Z> type) {
this.type = type;
}
/** Méthode privée permettant de créer une instance par la reflection
* (si un constructeur vide est présent)
*/
private Z newInstance() {
try {
return this.type.newInstance();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// ... du bazar ici, constructeur etc...
// une méthode
public void maMéthode () {
// admettons qu'ici j'ai envie d'instancier un Z (j'ai mes raisons)
Z instance = newInstance();
// ensuite je peux disposer de ma nouvelle instance tout fraîche
instance.abuseDeMoi();
}
} |
Problème : cela allourdit encore la déclaration des instances :
Foo<MaClasseBar> foo = new Foo<MaClasseBar>(MaClasseBar.class);
a++
Partager