-
錯誤的出現
在用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改成如下形式,便可以成功運行了
重構時出現的小插曲,也反映了基本功的不扎實,不過相信一件一件解決,也會變得很厲害