591 votes

Obtenez le type générique de classe lors de l’exécution

Comment est-ce que je peux réaliser cela ?

Tout ce que j’ai essayé jusqu'à présent toujours retourne type `` plutôt que le type spécifique utilisé.

Merci beaucoup.

367voto

Henning Points 8776

Comme d’autres ont mentionné, il est <strike>impossible</strike> seulement faisable avec réflexion.

Si vous avez vraiment besoin du type, c’est le modèle habituel de contournement (type sécurisé) :

294voto

FrVaBe Points 14559

J’ai vu quelque chose comme ça

dans la mise en veille prolongée GenericDataAccessObjects exemple

115voto

ewernli Points 23180

Les génériques ne sont pas réifiée au moment de l'exécution. Cela signifie que l'information n'est pas présent au moment de l'exécution.

Ajouter les génériques de Java alors que maintenir la compatibilité descendante a été un tour de force (vous pouvez voir l'article fondateur: Rendre l'avenir sûr pour le passé: l'ajout de genericity pour le langage de programmation Java).

Il existe une riche littérature sur le sujet, et certaines personnes sont insatisfait de l'état actuel, certains disent que c'est en fait un leurre et il n'y a pas de réel besoin d'elle. Vous pouvez lire les deux liens, je les ai trouvé très intéressant.

44voto

josefx Points 8417

Génériques de Java sont pour la plupart de la compilation, ce qui signifie que les informations de type sont perdues lors de l’exécution.

est compilé en quelque chose comme

Pour obtenir les informations de type au moment de l’exécution, vous devrez l’ajouter en tant qu’argument de la ctor.

Exemple :

43voto

Joeri Hendrickx Points 6957

Bien sûr, vous pouvez.

Java n'utilise pas l'information au moment de l'exécution, pour des raisons de rétro-compatibilité. Mais l'information est réellement présent sous la forme de métadonnées et peut être consulté via la réflexion (mais il n'est pas encore utilisé pour la vérification de type).

De la officielle de l'API:

http://download.oracle.com/javase/6/docs/api/java/lang/reflect/ParameterizedType.html#getActualTypeArguments%28%29

Cependant, pour votre scénario, je ne voudrais pas utiliser la réflexion. Personnellement, je suis plus enclin à utiliser pour le code de la structure. Dans votre cas, je voudrais juste ajouter le type de constructeur param.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X