本文主要是介绍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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!