[Hibernate重构Dao插曲]java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType错误

  • 错误的出现

  在用Hibernate重构Dao时,设计了如下的结构

  1.dao接口 

  

  2.daoImpl

    

  3.使用        

 

  • 处理错误&&回顾知识

  1.构造方法中的this是谁?

    

    

  2.理解getGenericSuperClass()方法

    方法解释:通俗来说,就是获得Class对象的直接超类 

  

  在DaoImpl中

this.getClass().getGenericSuperclass()

  输出结果为:

class java.lang.Object

  结论:很明显我这个问题正是出现在这里,在学习时理解不到位才会写出这样的代码,试图把一个非参数类型 转换成 ParameterizedType。对应源代码问题就出在这一行:

ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass();//导致了错误,

  


  • sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class(问题的再出现)

   知道了getGenericSuperclass()导致了错误,我便换了一个方法来继续。

  getGenericInterfaces():通俗的来讲,就是获得Class对象所实现的接口。  

this.getClass().getGenericInterfaces()[0];//输出结果:dao.Dao<T>

  

  现在我们的DaoImpl变成了如下这样:

  

  运行 ,依旧出现了java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType

  

  • 处理错误&&回顾知识

  1.回顾两个泛型的概念:

     (1)泛型类,在实例化类的时候指定泛型的具体类型

     (2)泛型方法,在调用方法的时候指定泛型的具体类型

  显然,当在

ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericInterfaces()[0];

  这条代码中获得了dao.Dao<T>这个参数类型,发现类型参数变量是T,并没有为它指定具体的类型,而导致出现的问题,如果我们把DaoImpl改成如下形式,便可以成功运行了

  

     

  重构时出现的小插曲,也反映了基本功的不扎实,不过相信一件一件解决,也会变得很厉害

   

原文地址:https://www.cnblogs.com/xingdongpai/p/5117527.html