zoukankan      html  css  js  c++  java
  • [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改成如下形式,便可以成功运行了

      

         

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

       

  • 相关阅读:
    webpack初体验
    Sql server 数据库 单用户切换为多用户
    JAVA加密
    TransactionScrope 2
    TransactionScrope
    ORA-14450
    C#.NET 各种连接字符串
    如何获取得到新浪的授权?
    加载JSON文件,Plist文件
    屏幕截图
  • 原文地址:https://www.cnblogs.com/xingdongpai/p/5117527.html
Copyright © 2011-2022 走看看