在网上找了一个hibernate通用dao泛型接口代码:
public interface GenericDao<T> {
void create(T entity); void delete(T entity);}
实现类:
package com.dao;import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;public class GenericHibernateDaoImpl<T> extends HibernateDaoSupport implements
GenericDao<T> {
private Class<T> clazz; @SuppressWarnings("unchecked")
public GenericHibernateDaoImpl() {
// 通过反射获取T的类型信息实例
this.clazz = (Class<T>) ((ParameterizedType) this.getClass()
.getGenericSuperclass ()).getActualTypeArguments()[0];
} public void create(T entity) { super.getSession().save(entity); } public void delete(T entity) {
super.getSession().delete(entity);
}.....
结果启动tomcat服务器的时候报java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType错误,什么问题?求解决。。

解决方案 »

  1.   

    不用这样实现泛型,你把泛型写在方法上就好了
    如/**
     * 
     */
    package com.zuxiang.annotationtest;import java.io.Serializable;
    import java.util.List;
    /**
     * @author zuxiang
     *
     */
    public class Dao { public <T> void delete(Serializable entityId){


    }

    public <T> void update(T entity){


    }

    public <T> void save(T entity){


    }
    public <T> T find(Serializable entityId){



    return t;
    }

    }
      

  2.   


    lz的意思就是想使用这个通用dao,尽量不写其他dao。明白吗?
      

  3.   

    泛型不能这么用
    你不能在运行时才去获取泛型的类型
    也就是说,必须在编译器就明确这个泛型对象
    public class GenericHibernateDaoImpl<T> extends HibernateDaoSupport implements
     GenericDao<T>
    按照这个类的定义来说,我觉得给类加上abstract比较好,不会让人产生歧义
    getActualTypeArguments需要用这个函数的话,你的类就应该已经被指定了泛型类型
    例如 public class MyDaoImpl<MyPOJO>
      

  4.   


    呵呵,abstract就沒有必要了。本身就是減少pg自己寫dao。lz試試這個:
    public GenericHibernateDaoImpl() {
            this.entityClass = null;
            Class c = getClass();
            Type t = c.getGenericSuperclass();
            if (t instanceof ParameterizedType) {
                Type[] p = ((ParameterizedType) t).getActualTypeArguments();
                this.entityClass = (Class<T>) p[0];
            }
        }
      

  5.   

    public interface GenericDao{
    void create(Class<T> entity);void delete(Class<T> entity);}
    把泛型定义在方法上就不会了!