在工作中使用泛型和Class类

本文探讨在开发中如何处理一个业务需求,即通过外部平台接口返回动态类型集合,如User或Department。作者分享了使用泛型和Class对象的实现方式,并解释了为什么使用<?extends BaseEntity>而非<TextendsBaseEntity>的原因。
摘要由CSDN通过智能技术生成

平时开发的话,虽然经常会使用到集合里的泛型操作,但是很少有直接参与含有泛型的接口的设计,
本次工作中遇到一个业务,是要求发一个别的外部平台接口,然后返回一个集合,集合里的对象类型要求是可变的。比如查User就返回User类型的集合,查Departpartment就返回Department类型的集合。那么这个要如何操作呢?
一开始我是这么写的

// Class<T> entity。T是一个数据类型,
// entity是一个Class类,Class类是用于反射
// 但是不要混淆entity就是反射本身。他是Class类

public List<T> userListByProvincePlatform(Class<T>  entity) throws Exception {
	
	//...定义一个集合用于返回,此处写的是T,因为指定的是数据类型
	List<T> itlms = ListUtil.empty();
	
	
	// ...业务省略
	// dataStr是json字符串
	JSONArray jsonArray = JSONUtil.parseArray(dataStr);
	
	// 此处传入的是一个Class类型
	itlms = jsonArray.toList( entity );
	return itlms;
}

泛型T规定了数据类型,而entity是一个Class对象,在参数中定义写法为

Class<T>  entity

再进一步改进,虽然entity是一个Class对象,但是他的数据类型也是有要求的,要求是继承于基本的BaseEntity类型
那么写法如下,将T改为<? extends BaseEntity>

@Override
    public List<? extends BaseEntity> userListByProvincePlatform(Class<? extends BaseEntity>  entity) throws Exception {
        List<T> itlms = ListUtil.empty();
        。。。

         JSONArray jsonArray = JSONUtil.parseArray(dataStr);
         itlms = jsonArray.toList( entity );
            。。。
        return itlms;
    }

完整代码如下

@Override
    public List<? extends BaseEntity> userListByProvincePlatform(Class<? extends BaseEntity>  entity) throws Exception {
        List<T> itlms = ListUtil.empty();
        Map<String, Object> formMap = MapUtil.newHashMap();
        formMap.put("systemId", this.systemId);
        formMap.put("systemPassword", this.systemPassword);
        formMap.put("gqYear", this.gqYearDefault);
        formMap.put("cityCode", this.cityCode);

        String body = HttpUtil.createRequest(Method.POST, this.getTrainRegisterUrl)
                .form(formMap)
                .timeout(180000)
                .execute()
                .charset("utf-8").body();

        if (JSONUtil.isJson(body)) {
            JSONObject jsonObject = JSONUtil.parseObj(body);
            Object code = jsonObject.get("code");
            Object msg = jsonObject.get("msg");
            log.error("状态码:" + code);
            log.error("信息:" + msg);

            if (StrUtil.equals("200", String.valueOf(code))) {
                String dataStr = (String) jsonObject.get("data");
                dataStr = SecureUtil.aes(HexUtil.decodeHex(this.systemRule))
                        .decryptStr(dataStr);

                JSONArray jsonArray = JSONUtil.parseArray(dataStr);
                itlms = jsonArray.toList( entity );
            }
        } else {
            log.error("访问失败:" + body);
        }
        return itlms;
    }

这里有个疑问,为何将T改为<? extends BaseEntity>:就可以,但是将T改为< T extends BaseEntity>:就不行了会报红了呢?

@Override
    public List<T extends BaseEntity> userListByProvincePlatform(Class<T extends BaseEntity>  entity) throws Exception {

希望能有大神帮忙解答下谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值