Spring不支持生成带泛型的bean

问题:

@Component
public class BaseDao<T extends BaseEntity> extends AbstractHibernateDao<T> {
}

异常:Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.jlpay.promise.dao.BaseDao]: Constructor threw exception; nested exception is java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class

原因:
这里写图片描述

解析:
  类似于本例中的构造方法,在方法中,需要得到BaseDaoImpl中的泛型,则先将通过this.getClass()方法获取BaseDaoImpl,然后转换为ParameterizedType类(参见末尾附言部分),然后通过ParameterizedType.getActualTypeArguments();方法可以得到<>中的所有泛型类型,但是如果将BaseDaoImpl在applicationContext.xml文件中创建bean,然后以此获取BaseDaoImpl对象进行使用,如图:
这里写图片描述

则运行时会报如下错误:
这里写图片描述
ERROR:Class类型不能转换为ParameterizedType类型
疑问:
  BaseDaoImpl不是泛型嘛,为什么不能转换为ParameterizedType类型。
原因:
  Spring不支持带泛型的类创建对象,因此,当Spring为BaseDaoImpl创建对象时,只把BaseDaoImpl当做BaseDaoImpl进行创建,因此this.getClass().getGenericSuperclass()返回的是class类型,而不是ParameterizedType,所以也就无法从Class类型转换为ParameterizedType类型。

附言:

  • ParameterizedType就是Java中的泛型,属于Type的子类。

  • ParameterizedType.getActualTypeArguments(),(Actual:真实的,目前的,实际的;Arguments:参数)字面翻译为:得到真实的类型参数,即泛型对应的真实类。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值