我是靠谱客的博主 老实板栗,这篇文章主要介绍sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class,现在分享给大家,希望可以做个参考。

主要代码:

复制代码
1
2
3
4
5
6
7
        private Class<T> beanClass; @SuppressWarnings("unchecked") public BaseDaoImpl() { ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass(); beanClass=(Class<T>) parameterizedType.getActualTypeArguments()[0]; }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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类不应该再添加泛型。

复制代码
1
2
3
4
5
public interface UserDao<User> extends BaseDao<User>{ }

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

因此正确的做法如下:

复制代码
1
2
3
4
5
6
7
8
package cn.smileyan.reflict.dao; import cn.smileyan.reflict.domain.User; public interface UserDao extends BaseDao<User>{ }
复制代码
1
2
3
4
5
6
7
private Class<T> beanClass; @SuppressWarnings("unchecked") public BaseDaoImpl() { ParameterizedType parameterizedType=(ParameterizedType)this.getClass().getGenericSuperclass(); beanClass=(Class<T>) parameterizedType.getActualTypeArguments()[0]; }

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部