先用例子来解释如下这两行代码:
ParameterizedType pt=(ParameterizedType) this.getClass().getGenericSuperclass();
Class clzz= (Class) pt.getActualTypeArguments()[0];
新建一个Dao接口
public interface Dao<T> {
public void save(T entity);
}
建一个实现类:
public class DaoImpl<T> implements Dao<T> {
public DaoImpl() {
// TODO Auto-generated constructor stub
}
@Override
public void save(T entity) {
ParameterizedType pt=(ParameterizedType) this.getClass().getGenericSuperclass();
Class clzz= (Class) pt.getActualTypeArguments()[0];
System.out.println("Class:"+clzz);
}
}
在建一个类继承这个泛型实现类
<pre name="code" class="java">public class StudentDao extends DaoImpl<Student> {
public static void main(String[] args) {
DaoImpl dao=new StudentDao();
System.out.println(dao.getClass());
dao.save(null);
}
}
此时系统在调用DaoImpl.save()方法时。里面的this.getClass()是class com.john.generic.StudentDao 所以
ParameterizedType pt=(ParameterizedType) this.getClass().getGenericSuperclass();
这句话的意思就是调用
StudentDao父类(即DaoImpl)参数类型。
Class clzz= (Class) pt.getActualTypeArguments()[0];
就是调用里面的第一个参数
DaoImpl<T> 中的<T> 若是想查看DaoImpl<T,O>中的第二个泛型O则用
Class clzz= (Class) pt.getActualTypeArguments()[1];