1. 在java中T.getClass() 或 T.class都是不合法的,因为T是泛型变量;
由于一个类的类型在编译期已确定,故不能在运行期得到T的实际类型;
2.获取方式是:
// 获取当前运行类泛型父类类型,即为参数化类型,有所有类型公用的高级接口Type接收!
Type type = this.getClass().getGenericSuperclass();
// 强转为“参数化类型”
//ParameterizedType参数化类型,即泛型
ParameterizedType pt = (ParameterizedType) type; // BaseDao<Department>
// 获取参数化类型中,实际类型的定义
Type[] ts = pt.getActualTypeArguments();
// 转换
this.clazz = (Class<T>) ts[0];
3.例子:
目录结构图为:
![](https://img-blog.csdn.net/20170314064438570?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3hpemhlbjEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Person类的代码如下:
// 获取当前运行类泛型父类类型,即为参数化类型,有所有类型公用的高级接口Type接收!
Type type = this.getClass().getGenericSuperclass();
// 强转为“参数化类型”
//ParameterizedType参数化类型,即泛型
ParameterizedType pt = (ParameterizedType) type; // BaseDao<Department>
// 获取参数化类型中,实际类型的定义
Type[] ts = pt.getActualTypeArguments();
// 转换
this.clazz = (Class<T>) ts[0];
public class Person<T> {
}
Student类的代码如下 :
package cn.wxz;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
public class Student extends Person<Student> {
public static void main(String[] args) {
Student stu=new Student();
Class clazz=stu.getClass();
System.out.println(clazz);
Type type = stu.getClass().getGenericSuperclass();
System.out.println(type);
// 强转为“参数化类型”
//ParameterizedType参数化类型,即泛型
ParameterizedType pt = (ParameterizedType) type; // BaseDao<Department>
// 获取参数化类型中,实际类型的定义
Type[] ts = pt.getActualTypeArguments();
// 转换
Class c= (Class) ts[0];
System.out.println(c);
}
}