日期:2014-05-19  浏览次数:20886 次

java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
在网上找了一个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错误,什么问题?求解决。。。。。

------解决方案--------------------
不用这样实现泛型,

你把泛型写在方法上就好了

Java code

/**
 * 
 */
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;
    }
    
}

------解决方案--------------------
探讨

不用这样实现泛型,

你把泛型写在方法上就好了

Java code

/**
*
*/
package com.zuxiang.annotationtest;

import java.io.Serializable;
import java.util.List;


/**
* @author zuxiang
*
*/
public class Dao {

……

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

泛型不能这么用
你不能在运行时才去获取泛型的类型
也就是说,必须在编译器就明确这个泛型对象
public class GenericHibernateDaoImpl<T> extends HibernateDaoSupport implements
GenericDao<T>
按照这个类的定义来说,我觉得给类加上abstract比较好,不会让人产生歧义
getActualTypeA……

------解决方案--------------------
public interface GenericDao{
void create(Class<T> entity);

void delete(Class<T> entity);

}
把泛型定义在方法上就不会了!