oui oui, ca arrive
J'ai une classe paramétrée A, avec un méthode attendant un argument d'une autre classe B ayant le même paramètre
1 2 3 4 5
|
public class B<T> {}
public class A<T> {
public void foo(B<T> arg) {}
} |
Je veux mocker l'argument arg en lui passant une instance d'une classe dérivée C de même paramètre
1 2 3 4 5
|
public class C<T> extends B<T> {}
C<Integer> mockedArgument = new C<>();
A<Integer> a = new A<>();
a.foo(mockedArgument); |
Jusque la pas de problème.
Ce que je voudrais, c'est éviter d'avoir à préciser moi-même le type générique de C, mais plutôt le déduire de celui de A.
La raison est que j'ai déja à disposition du code utilisant A et B, avec plusieurs type T sous-jacent, et que j'aimerais avoir un mocking générique qui évite d'avoir à repréciser <T> au cas par cas.
Donc je récupère au runtime le type <T> de A via reflexion (enfin la classe et non le type - c'est tout mon problème):
Class genericParameter = (Class) ((ParameterizedType) A.class.getGenericSuperclass()).getActualTypeArguments()[0];
Et j'essaie ensuite de créer C avec cette information, et c'est la ou je bloque.
Les remarques de Joel indiquent que c'est trop tard (le runtime) pour y arriver. Ce que ma phrase laconique signifie, c'est que j'accède à cette information au runtime (reflexion), mais que cette information est a priori disponible au moment de la compilation.
J'ai croisé des construction ou le type et la classe étaient passés en argument générique, est-ce une bonne approche ?
Sinon, j'imagine que je pourrai définir C interne à une classe MockedA (pour récupérer les bons génériques), et réaliser le mocking en changeant new A() par new MockedA() - mais c'est justement ce style intrusif (modifiant un code déja existant) que j'essaye d'éviter.
Partager