我是靠谱客的博主 老实板栗,最近开发中收集的这篇文章主要介绍sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
主要代码:
private Class<T> beanClass;
@SuppressWarnings("unchecked")
public BaseDaoImpl() {
ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass();
beanClass=(Class<T>) parameterizedType.getActualTypeArguments()[0];
}
public class DaoTest {
public static void main(String[] args) {
UserDao<User> baseDao=new UserDaoImpl<>();//出错只在这行代码
User user=new User();
user.setEmail("email");
user.setNickname("nickname");
user.setPassword("password");
user.setId(0);
user.setUsername("username");
baseDao.getAll("where id=1");
}
}
报错原因:
因为UserDaoImpl类不应该再添加泛型。
public interface UserDao<User> extends BaseDao<User>{
}
这样的设计是错误的,因为泛型在父类中即已经用到了,而UserDaoImpl是不需要再次用泛型,而是用父类的泛型即可。
因此正确的做法如下:
package cn.smileyan.reflict.dao;
import cn.smileyan.reflict.domain.User;
public interface UserDao extends BaseDao<User>{
}
private Class<T> beanClass;
@SuppressWarnings("unchecked")
public BaseDaoImpl() {
ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass();
beanClass=(Class<T>) parameterizedType.getActualTypeArguments()[0];
}
public class DaoTest {
public static void main(String[] args) {
UserDao baseDao=new UserDaoImpl();//出错只在这行代码
User user=new User();
user.setEmail("email");
user.setNickname("nickname");
user.setPassword("password");
user.setId(0);
user.setUsername("username");
baseDao.getAll("where id=1");
}
}
总而言之,如果自己想要的是拿到父类方法的泛型,自己就不要再添加泛型。
另外类的设计上最开始就应该清楚,这个类在父类已经有泛型的情况是否还需要泛型。
最后
以上就是老实板栗为你收集整理的sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class的全部内容,希望文章能够帮你解决sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复