2010-07-15 7 views
1

Je voudrais savoir comment (si possible) les paramètres génériques d'une classe peuvent être déterminés au moment de l'exécution. D'après ce que j'ai lu c'est possible avec des sous-classes de types génériques, mais je n'ai pas été capable de savoir comment le faire avec le type lui-même. Il y a de bonnes infos dans ces liens, mais je ne suis pas sûr que ce soit ce que je cherche.Déterminer les paramètres de type générique à l'exécution en Java

http://blog.xebia.com/2009/02/07/acessing-generic-types-at-runtime-in-java www.artima.com/weblogs/viewpost.jsp?thread=208860

Ce que je suis en fin de compte essayer d'accomplir, est d'obtenir Gson sérialiser la variable « _bucket » ci-dessus, la classe nom du type 'T'.

J'apprécierais que quelqu'un puisse me diriger dans la bonne direction.

+0

La solution de contournement pour stocker un 'private final Class typeParam' et le transmettre dans le constructeur. – ILMTitan

Répondre

6

Le type générique n'est pas disponible au moment de l'exécution dans l'exemple donné. Les informations de type générique ne sont disponibles via la réflexion que si elles ont été spécifiées lors de la compilation — par exemple, si vous avez défini une sous-classe SomeTypeJson extends Json<SomeType>.

En tant que kludge, vous pouvez deviner le type générique en examinant le contenu du List, trouvant la superclasse commune la plus spécifique par réflexion.

+0

Merci Erickson, je vais voir à propos de contourner le problème. –

0

En général, vous devez sous-classer ce type pour donner un type concret, puis les packages de traitement doivent pouvoir résoudre correctement le type. Alternativement, de nombreux paquets ont un concept de référence de type quelconque ("type token"), qui utilise simplement la classe anonyme pour fournir des informations de type afin que le deserializer puisse déduire correctement le type voulu; Je ne me souviens pas de la classe utilisée par Gson, il devrait avoir quelque chose comme ça disponible. Si la seule chose que vous avez est une instance d'exécution alors vous n'avez pas de chance, à l'exception d'avoir List non vide et en vérifiant le type (comme suggéré).