2009-08-30 6 views
11

Je suis en train de faire quelque chose comme ceci en Java:Existe-t-il un moyen de trouver le type d'un paramètre template (générique) en Java?

public static <T> T foo() { 
    return (T) bar(T); 
} 

public static Object bar(Class<?> klaz) { 
    return klaz.newInstance(); 
} 

Mais le code ne compile pas, puisque je ne peux pas remplacer T pour une classe <>?.
Avec une classe concrète, je peux appeler bar comme:

bar(ConcreteClass.class); 

Mais même ne fonctionne pas pour T. à-dire qu'il n'y a pas une telle chose comme T.class

En C#, typeof travaux pour les deux types de béton et de modèle. Donc, l'appel à la barre aurait été:

bar(typeof(T)); 

Mais je n'ai pas été en mesure de trouver quelque chose de similaire en Java. Est-ce que je manque quelque chose, ou est-ce que Java n'a pas le moyen d'obtenir le type d'un paramètre de modèle? Et si Java n'a pas la facilité, y a-t-il des solutions de contournement?

Répondre

14

Il n'y a aucun moyen d'obtenir le type. Les génériques de Java utilisent l'effacement de type alors même java ne sait pas ce que T est à l'exécution. Pour les solutions de contournement: vous pouvez définir foo pour prendre un paramètre de type Class<T>, puis l'utiliser.

Questions connexes