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

  

     

  重構時出現的小插曲,也反映了基本功的不扎實,不過相信一件一件解決,也會變得很厲害

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM