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
- 为一个genericsC#集合中的每个值调用一个函数
- C#generics能有一个特定的基types吗?
- 如何在Java中为generics类创buildgenerics构造函数?
- generics与接口的实用优势
- 将Hibernate Query.list()转换为List <Type>的“正确”方法是什么?
- Javatypes作为GSON的参数
- List <Dog>是List <Animal>的一个子类吗? 为什么不是Java的generics隐式多态?
- 谷歌Gson – 反序列化列表<class>对象? (通用型)
- 为什么在generics中使用Collections.emptySet()而不是作为方法参数?