java class多重泛型_多重继承求泛型类的类型

基本类:

@Repository

public class HibernateDao{

protected Logger logger = LoggerFactory.getLogger(getClass());

protected Class entityClass;

public HibernateDao() {

logger.debug(String.valueOf(getEntityClass()));

}

/**

* 求泛型的类类型

* @return

*/

protected Class getEntityClass(){

logger.debug("this.class: " + this.getClass());

logger.debug("this.getClass().getGenericSuperclass(): " + this.getClass().getGenericSuperclass());

if(null == entityClass){

entityClass = (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];

}

logger.debug("entityClass: " + entityClass);

return entityClass;

}

....

}

@Repository

public class BaseDao extends HibernateDao {

}

//应用层 处理具体的业务

@Repository

public class UserDao extends BaseDao {

}

继承关系很明显了,我现在BaseSrvice中实例化BaseDao:

@Service

@Transactional

public abstract class BaseService {

protected Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired

private BaseDao baseDao;

public BaseService() {

printEntityClass();

}

//帮助理解

private void printEntityClass(){

ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();

Class c = (Class) type.getActualTypeArguments()[0];

logger.debug(c.toString());

}

...

}

之后我在Junit中编写一个测试类【注意:应用层的测试实例】:

public class UserServiceTest extends BaseTestConfig {

@Autowired

private UserService userService;

@Test

public void testList2(){

String id = "40283a814f7d92f7014f7d956bf50007";

userService.get(id);

}

}

运行结果

1c264abcc011a71ac7313091089b6283.png

说明HibernateDao求泛型的时候,抛异常了。

修改下BaseService,将

@Autowired

private BaseDao baseDao;

改为

@Autowired

private BaseDao baseDao;

再次运行:

7ff9188d8d665c532be652a34a7a27c7.png

异常消失,注意:HibernateDao求泛型的打印输出的变化。

II.this.getClass().getGenericSuperclass();求出的是直接父类。如UserDao的直接父类为BaseDao而不是HibernateDao。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值