sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

主要代码:

        private Class beanClass;
	
	@SuppressWarnings("unchecked")
	public BaseDaoImpl() {
		ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass();
		beanClass=(Class) 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");
	}
}

 

报错原因:

 

因为UserDaoImpl类不应该再添加泛型。

public interface UserDao extends BaseDao{
    
}

这样的设计是错误的,因为泛型在父类中即已经用到了,而UserDaoImpl是不需要再次用泛型,而是用父类的泛型即可。

因此正确的做法如下:

package cn.smileyan.reflict.dao;

import cn.smileyan.reflict.domain.User;

public interface UserDao extends BaseDao{
	
}
private Class beanClass;
	
	@SuppressWarnings("unchecked")
	public BaseDaoImpl() {
		ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass();
		beanClass=(Class) 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");
	}
}

 

总而言之,如果自己想要的是拿到父类方法的泛型,自己就不要再添加泛型。

 

另外类的设计上最开始就应该清楚,这个类在父类已经有泛型的情况是否还需要泛型。

你可能感兴趣的:(我的大后端,我的Java)