平时开发的话,虽然经常会使用到集合里的泛型操作,但是很少有直接参与含有泛型的接口的设计,
本次工作中遇到一个业务,是要求发一个别的外部平台接口,然后返回一个集合,集合里的对象类型要求是可变的。比如查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 {
希望能有大神帮忙解答下谢谢