如何获取继承类中的泛型T的类型
首先, T.getClass() 或 T.class都是非法的,因为T是泛型变量;
由于一个类的类型在编译期已确定,故不能在运行期得到T的实际类型;
获取方式如下:
abstract class A<T> {
public Class<T> getGenericType() {
Class<T> clz = (Class<T>) (((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
return clz;
}
}
上面的代码不是万能的,只有实例化T的子类才能按上述方法获得T的实际类型,
如果子类没有实例化T,则无法获取T的实际类型;
比如,class B 并没有实例化T,所以得不到String.class;
代码如下:
class B<T> extends A<T> {
public static void main(String[] args) {
B<String> b = new B<String>();
System.out.println(b.getGenericType());
}
}
正确的 代码如下:
class C extends A<String> {
public static void main(String[] args) {
C c = new C();
System.out.println(c.getGenericType());
}
}
class C按如上方式声明,则可以得到String.class;
以上转载(有所修改)自 http://bbs.chinaunix.net/thread-3677562-1-1.html
对于获取泛型的方法,比较完整的代码如下,
class BaseDaoImpl<T> implements IBaseDao<T> {
public BaseDaoImpl() {
Class<T> clz = (Class<T>) getSuperClassGenricType(this.getClass());
System.out.println(clz);
}
/**
* 通过反射,获得定义Class时声明的父类的泛型参数的类型. 如无法找到,返回Object.class
*/
public static Class<Object> getSuperClassGenricType(final Class clz) {
Type type = clz.getGenericSuperclass();
if(!(type instanceof ParameterizedType)) {
return Object.class;
}
Type[] params = ((ParameterizedType)type).getActualTypeArguments();
if(!(params[0] instanceof Class)) {
return Object.class;
}
return (Class) params[0];
}
}
以上代码参考:http://blog.csdn.net/running\_snail\_/article/details/7077947
另外,badqiu的脚手架项目代码中,有另外一种方式,父类本身不获取泛型的具体类型,
仅提供抽象方法,由子类来提供具体的类型;
public abstract class A<T> {
public abstract Class getEntityClass();
}
public class B extends A<String> {
public Class getEntityClass() {
return String.class;
}
}
另外,请参考 http://developer.51cto.com/art/201103/250028.htm
还没有评论,来说两句吧...