今天写CRM项目时,在最后抽取BaseDao时,居然无法通过,TMD看见教程上老师也是这样写的就是没报错,我的就报错,感觉郁闷至极,错误如下:
java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
报错代码如下:
@Repository("baseDao")
public class BaseDaoImpl<T> implements BaseDao<T>{
@Resource(name="hibernateTemplate")
private HibernateTemplate hibernateTemplate;
private Class clazz;
//构造方法
public BaseDaoImpl() {
//1.得到当前运行类的class对象
Class cs = this.getClass();
//2.得到运行类的父类的参数化类型
Type type = cs.getGenericSuperclass();
//把ptype转换成Type的子接口类型
ParameterizedType ptype=(ParameterizedType) type;
//3.得到实际类型参数
Type[] types = ptype.getActualTypeArguments();
//4.把types变成其实现类Class
Class classImpl =(Class) types[0];
this.clazz=classImpl;
}
}
@Override
public void save(T t) {
hibernateTemplate.save(t);
}
@Override
public void delete(T t) {
hibernateTemplate.delete(t);
}
@Override
public void update(T t) {
hibernateTemplate.update(t);
}
@Override
public List<T> findAll() {
return (List<T>) hibernateTemplate.find("select new "+clazz.getSimpleName()+"(cust_id,cust_name) from "+clazz.getSimpleName());
}
@Override
public T findOne(int id) {
return (T) hibernateTemplate.load(clazz, id);
}
经过网上大量搜索,几乎没有什么靠谱答案,后来我觉得既然是多态,那就先判断一下试试,哈哈哈,最后终于成功了.
下面这是经过修改后的代码,稳一笔
@Repository("baseDao")
public class BaseDaoImpl<T> implements BaseDao<T>{
@Resource(name="hibernateTemplate")
private HibernateTemplate hibernateTemplate;
private Class clazz;
//构造方法
public BaseDaoImpl() {
//1.得到当前运行类的class对象
Class cs = this.getClass();
//2.得到运行类的父类的参数化类型
Type type = cs.getGenericSuperclass();
//把ptype转换成Type的子接口类型
if (type instanceof ParameterizedType) {
ParameterizedType ptype=(ParameterizedType) type;
//3.得到实际类型参数
Type[] types = ptype.getActualTypeArguments();
//4.把types变成其实现类Class
Class classImpl =(Class) types[0];
this.clazz=classImpl;
}
}
@Override
public void save(T t) {
hibernateTemplate.save(t);
}
@Override
public void delete(T t) {
hibernateTemplate.delete(t);
}
@Override
public void update(T t) {
hibernateTemplate.update(t);
}
@Override
public List<T> findAll() {
return (List<T>) hibernateTemplate.find("select new "+clazz.getSimpleName()+"(cust_id,cust_name) from "+clazz.getSimpleName());
}
@Override
public T findOne(int id) {
return (T) hibernateTemplate.load(clazz, id);
}