最近,在项目中由于一个接口要适配多个不同场景的调用,所以导致这个接口的出参与入参都不可确定,需要用到泛型,这里简单记录一下我的用法。
泛型的用法分为泛型类,泛型接口,泛型方法。
1、泛型类
由于项目中过多的设计分页查询,所以,写了一个泛型类,这个对象中包含一个分页信息对象,一个查询条件泛型对象,用来接收不同的查询条件
2、泛型接口
不同的业务场景都需要调用这个接口,而且不同场景的入参与出参都有所差异,写一个泛型接口,不同场景实现类,实现这个接口,给定不同出参与入参
3、泛型方法
泛型方法,平时用的比较少,这里举一个类型匹配的方法例子。实际开发中,可以套用根据不同对象类型做不同逻辑处理的场景。
总结:
(1)为什么使用泛型
事先并不确定具体类型,或者需要一个接口,方法,字段适配多种不同的情况下使用
(2)有什么好处
在没有使用泛型开发之前,使用Object来表示通用类型,但是使用Object需要进行强制转换,使用很麻烦,并且强制转换并不会进行编译检查,运行期间容易抛出类型转换异常错误。使用泛型不用进行强转,编译期间也会检查类型,更加方便,安全。
(3)需要注意的一点
接口泛型,一个虚拟类实现这个接口中的某几个方法,没有实现的方法中如果包含泛型,那么虚拟类的命名上需要标注泛型,等待其子类实现这个泛型
虚拟类中未确定的泛型,在其子类中实现确定,写法如上。
(4)如果controller层接口入参对象中包含泛型,不进行json转换会报错误
入参对象:
controller接口:
service接口:
报错:
java.lang.ClassCastException: com.alibaba.fastjson.JSONObject cannot be cast to com.utry.ucsc.task.vo.TaskOrderDetailsReq
service代码修改:
T t = req.getT();
JSONObject jsonObject = (JSONObject)t;
TaskOrderDetailsReq taskOrderDetailsReq = JSONObject.toJavaObject(jsonObject, TaskOrderDetailsReq.class);
return taskService.getOrderTaskDetails((T) taskOrderDetailsReq)
泛型对象先进行json转换,然后塞入方法,如果泛型对象中嵌套泛型对象,则还需要进一步对最里面的泛型对象进行json转换。
如果泛型对象是个list集合,则用 jsonArray.toJavaList 进行json转换