[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改成如下形式,便可以成功运行了
重构时出现的小插曲,也反映了基本功的不扎实,不过相信一件一件解决,也会变得很厉害