Java génériques – obtenir de la classe?

J’ai une liste, programmée comme ceci: public class MyList . Y a-t-il un moyen d’utiliser la variable T pour obtenir le nom de la classe (donc, dans MyList , je peux savoir si T est Ssortingng, Socket, etc.)?

EDIT: Nevermind, a trouvé la réponse ici .

Réponse courte : Vous ne pouvez pas.

Réponse longue :

En raison de la manière dont les génériques sont implémentés en Java, le type générique T n’est pas conservé au moment de l’exécution. Cependant, vous pouvez utiliser un membre de données privé:

 public class Foo { private Class type; public Foo(Class type) { this.type = type; } } 

J’aime la solution de

http://www.nautsch.net/2008/10/28/class-von-type-parameter-java-generics/

 public class Dada { private Class typeOfT; @SuppressWarnings("unchecked") public Dada() { this.typeOfT = (Class) ((ParameterizedType)getClass() .getGenericSuperclass()) .getActualTypeArguments()[0]; } ... 

Vous voyez le résultat de Type Erasure . De cette page …

Lorsqu’un type générique est instancié, le compilateur traduit ces types par une technique appelée effacement de type – un processus où le compilateur supprime toutes les informations liées aux parameters de type et les arguments de type dans une classe ou une méthode. L’effacement de type permet aux applications Java qui utilisent des génériques de maintenir une compatibilité binary avec les bibliothèques et les applications Java créées avant les génériques.

Par exemple, Box est converti en type Box, appelé type brut – un type brut est une classe générique ou un nom d’interface sans aucun argument de type. Cela signifie que vous ne pouvez pas savoir quel type d’object une classe générique utilise lors de l’exécution.

Cela ressemble aussi à cette question qui a aussi une bonne réponse .

Je ne suis pas sûr à 100% si cela fonctionne dans tous les cas (nécessite au moins Java 1.5):

 import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; public class Main { public class A { } public class B extends A { } public Map map = new HashMap(); public static void main(Ssortingng[] args) { try { Field field = Main.class.getField("map"); System.out.println("Field " + field.getName() + " is of type " + field.getType().getSimpleName()); Type genericType = field.getGenericType(); if(genericType instanceof ParameterizedType) { ParameterizedType type = (ParameterizedType) genericType; Type[] typeArguments = type.getActualTypeArguments(); for(Type typeArgument : typeArguments) { Class classType = ((Class)typeArgument); System.out.println("Field " + field.getName() + " has a parameterized type of " + classType.getSimpleName()); } } } catch(Exception e) { e.printStackTrace(); } } } 

Cela va sortir:

La carte de terrain est de type Map
La carte de terrain a un type paramétré de A
La carte de terrain a un type paramétré de B

Je peux obtenir la classe du type générique de cette façon:

 class MyList { Class clazz = (Class) DAOUtil.getTypeArguments(MyList.class, this.getClass()).get(0); } 

Vous avez besoin de deux fonctions de ce fichier: http://code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao/src/main/java/com/googlecode/genericdao/dao/DAOUtil. Java

Pour plus d’explications: http://www.artima.com/weblogs/viewpost.jsp?thread=208860