首页 > 编程语言 > 详细

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

时间:2016-01-10 00:23:24      阅读:185      评论:0      收藏:0      [点我收藏+]

 

  • 错误的出现

  在用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改成如下形式,便可以成功运行了

  技术分享

     

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

   

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

原文:http://www.cnblogs.com/xingdongpai/p/5117527.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!