2009-07-27 6 views
0

Je voudrais pouvoir detirmine le type de mon appel de méthode de retour lors de l'exécution, mais je ne peux pas sembler être en mesure d'obtenir le type de T.méthode générique en Java, déterminer le type

public <T> T getT() 
    { 
     Object t = null; 
     Class<?> c = t.getClass(); 
     System.out.println(c.getName()); 
     return (T) t; 
    } 

Est-il possible de déterminer le type de T à l'exécution en Java?

+0

un coup d'oeil à cette explication de * effacement *: http: //stackoverflow.com/questions/313584/what-is-the-concept-of-erasure-in -generics-in-java/313590 # 313590 (j'aurais pu mettre cela en réponse et j'ai essayé d'obtenir des points en utilisant Jon Skeet! – akf

+0

votre seconde ligne de la méthode va lancer une exception NullPointerException.) – akf

+0

akf: Je pense que le point est que le questionneur aimerait que le code fonctionne, plutôt que ses tentatives actuelles qu'il ou elle reconnaît ne pas. –

Répondre

5

Votre fonction lancera une exception NullPointerException, car vous appelez "getClass" sur un pointeur nul (puisque t est initialisé avec null). De plus, les génériques sont utilisés pour ajouter une vérification de type à la compilation. Ils ne vous donnent rien de spécial à l'exécution; les génériques utilisent simplement type Object, mais provoquent le code qui utilise l'objet générique pour effectuer des lancements implicites et amène également le compilateur à être conscient de la façon dont vous l'utiliserez.

+0

Une grande partie du «suckiness» des génériques de Java s'est produite parce que la conception devait pragmatiquement être rétrocompatible avec les bibliothèques JDK 1.4 et antérieures. –

0

Si vous avez une classe générique, vous pouvez écrire un constructeur qui prend le type et l'enregistre dans un membre de votre classe. De cette façon, vous pouvez vérifier le type pendant l'exécution. Toutes les informations qui sont seulement dans les génériques sont partis après la compilation.

+0

Je travaille sur un projet de base de données CRUD, et il a beaucoup de types, donc cette solution ne fonctionnera pas :-( – Milhous

1

Les génériques Java sont une fonctionnalité de vérification de type statique. Tenter de récupérer des artefacts de réflexion à partir de paramètres génériques est typique d'une conception mal conçue.

Dans l'exemple de question, il n'y a aucune garantie que T est une classe ou une interface paire. Par exemple

List<? extends Frogs> list = thing.getT(); 

Si vous voulez vraiment aller dans cette voie (et je vous suggère fortement ne pas, pas que je vous attends de prendre un avis), vous pouvez fournir un objet de réflexion qui est statiquement lié au paramètre générique comme argument:

public <T> T getT(Class<T> clazz) { 
    Object value = map.get(clazz); 
    return clazz.cast(value); 
} 
+0

Dans ma conception actuelle, je fais exactement cela, mais je finis par devoir passer la classe, quand je voudrais vraiment pour connaître le type auquel renvoie le type de retour – Milhous

+0

Il n'y a pas nécessairement d'objet 'Class' applicable, même si la fonction de compilation était disponible au moment de l'exécution. –

Questions connexes