Javagenerics – 获得类?

我有一个列表,编程如下: public class MyList<T> 。 有没有办法使用Tvariables来获取类的名称(所以我可以从MyList中知道如果T是string,套接字等)?

编辑:没关系,在这里find答案。

简短的回答 :你不能。

很长的回答

由于generics在Java中的实现方式,通用typesT在运行时不保留。 不过,您可以使用私人数据成员:

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

我喜欢这个解决scheme

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

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

您正在看到“ types擦除”的结果。 从那个页面…

当genericstypes被实例化时,编译器通过称为types擦除的技术翻译这些types – 编译器在类或方法中删除与types参数和types参数相关的所有信息的过程。 types擦除使得使用generics的Java应用程序能够保持与generics之前创build的Java库和应用程序的二进制兼容性。

例如,Box <String>被转换为Boxtypes,这被称为原始types – 原始types是没有任何types参数的generics类或接口名称。 这意味着你不能在运行时发现generics类正在使用什么types的对象。

这也看起来像这个问题 ,也有一个很好的答案 。

我不是100%确定这是否适用于所有情况(至less需要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<A, B> map = new HashMap<Main.A, Main.B>(); public static void main(String[] 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(); } } } 

这将输出:

字段映射是Maptypes的
字段映射具有A的参数化types
字段映射具有B的参数化types

我能够以这种方式获得generics类的类:

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

你需要这个文件的两个function: http : //code.google.com/p/hibernate-generic-dao/source/browse/trunk/dao/src/main/java/com/googlecode/genericdao/dao/DAOUtil。 java的

更多解释: http : //www.artima.com/weblogs/viewpost.jsp? thread= 208860