java 泛型作为方法的返回值的封装

这篇具有很好参考价值的文章主要介绍了java 泛型作为方法的返回值的封装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题背景

业务需要,经常需要http方式调用某服务,然后某服务返回特定类型的返回内容。
类似 String resStr = xxxHttpClient.post() ,然后它返回一个字符串,你还需要反序列化成某种格式的。

返回值可以反序列化成的形式如下:

{
	 private String code;

    private String message;

	//这里的这个“T”,就是根据具体业务需要而不同的类型,可能是一个class,也可能是一个List等
    private T data;
}

注意,这里的这个T是个活的,它可能根据接口的内容不同而不同。

  1. 有时候是个普通对象,如
public class StudentInfo{
	private Integer age;
	private String name;		
}

这样。
2. 有时候是个List,如 List<StudentInfo> 这样
3. 有时候是个嵌套对象,如:

public class StudentInfo{
	private Integer pageNum;
	private Integer pageSize;
	private Integer totalCount;
	private List<StudentInfo> list;		
}

这样。

甚至更多种情况,那么,要怎么办呢?
还挺不好写活的。

封装了一个方法,实现上述功能

(已删除若干不相干代码,不影响含义)

import cn.xxx.dto.BaseCommonResDTO;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * @author 
 * @date 2023年8月25日
 * @desc 泛型方法,返回泛型,完美封装
 * https://blog.csdn.net/qq_39348918/article/details/120529916
 */
@Slf4j
@Component
public class MyCustomHttp {

    /**
     * 返回数据类型
     * 其中T是xxx的htttp接口返回的数据的类型
     *
     * @param url
     * @param params
     * @return
     */
    public <T extends Object> T doPost(String url, Map<String, String> params, Class<T> clazz) {

        //当前时间戳

        Long timestamp = System.currentTimeMillis();

        String sign = .....;

        //headers
        Map<String, String> heads = ...;


        ResponseBody responseBody = myXXHttpClient.doPost(url, heads, params);

        String responseMsg = responseBody.getResponseMsg();

        //普通反序列化
        //MyDataResDTO myDataResDTO = JSONObject.parseObject(reposeBody.getResponseMsg(), MyDataResDTO.class);

        //嵌套类反序列化
        BaseCommonResDTO<T> result = JSONObject.parseObject(responseMsg, new TypeReference<BaseCommonResDTO<T>>(clazz) {
        });

        if (null != result) {
            T data = result.getData();
            return data;
        } else {
            return null;
        }
    }

    public <T extends Object> List<T> doPostForList(String url, Map<String, String> params, Class<T> clazz) {

        //当前时间戳

        Long timestamp = System.currentTimeMillis();

        String sign = ...;

        //headers
        Map<String, String> heads = ...;

		// 这里的这个`myXXHttpClient`,就是随便一个什么库里的发http请求的就行了,或者自己封装。
        ResponseBody responseBody =myXXHttpClient.doPost(url, heads, params);

        String responseMsg = responseBody.getResponseMsg();

        //普通反序列化
        //MyDataResDTO myDataResDTO = JSONObject.parseObject(reposeBody.getResponseMsg(), MyDataResDTO.class);

        //嵌套类反序列化
        BaseCommonResDTO<List<T>> result = JSONObject.parseObject(responseMsg, new TypeReference<BaseCommonResDTO<List<T>>>(clazz) {
        });

        if (null != result) {
            List<T> data = result.getData();
            return data;
        } else {
            return null;
        }
    }
}

使用举例

调用的时候


//返回对象 (包括返回普通对象 和  返回嵌套对象,都亲测成功)
public StudentInfo getStudentInfo (Integer page, Integer pageSize) {

    Map<String, String> params = Maps.newHashMap();
    params.put("param1", page);
    params.put("param2", pageSize);

    StudentInfo studentInfo = MyCustomHttp.doPost(url, params, StudentInfo.class);

    return studentInfo;
}


//返回list
public List<StudentInfo> getAllStudentInfos(Integer page, Integer pageSize) {

    Map<String, String> params = Maps.newHashMap();
    params.put("param1", page);
    params.put("param2", pageSize);

    List<StudentInfo> studentInfos= MyCustomHttp.doPostForList(url, params, StudentInfo.class);

    return studentInfos;
}

然后再使用就非常优雅了。
主要思想就是把想返回的数据类型,作为doPostdoPostForList的第三个参数传入,从而实现灵活控制接口返回类型的目的。
感觉效果不错,推荐使用。文章来源地址https://www.toymoban.com/news/detail-686580.html

到了这里,关于java 泛型作为方法的返回值的封装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java~用泛型来定义异常类型,避免方法调用时throws异常

    我们一般在底层写方法时,如果方法显示throws异常,那么在调用时,也需要将这个异常throws出来,例如 调用时 如果调用时不显示throws出异常,编译器会报出错误,如下图 调用方法时,不需要再throws Ex了,这种对调用者更友好,如图 在第一个方法中,使用了泛型类型 来定义

    2024年02月21日
    浏览(40)
  • Java获取泛型类型信息

    根据使用泛型位置的不同可以分为:声明侧泛型、使用侧泛型。 声明侧的泛型信息被记录在Class文件的Constant pool中以Signature的形式保存。而使用侧的泛型信息并没有保存。 声明侧泛型 声明侧泛型包括: 泛型类,或泛型接口的声明 带有泛型参数的成员变量 带有泛型参数的方

    2024年02月09日
    浏览(38)
  • Java泛型:灵活多变的类型参数化工具

    👑专栏内容:Java ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 在传统的编程方法中,类和方法通常被限定为使用特定的类型。这些类型可能是基础的数据类型(如整数、字符等),或者是由程序员自己定义的复杂类型。这种方式在处理单一类型数据时很有

    2024年02月01日
    浏览(61)
  • 【Java 基础篇】Java类型通配符:解密泛型的神秘面纱

    在Java中,类型通配符(Type Wildcard)是泛型的重要概念之一。它使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。本文将深入探讨Java类型通配符的用法、语法和最佳实践。 类型通配符是一个用问号 ? 表示的通配符,它可以用于泛型类、方法和通配符边界。类型

    2024年02月07日
    浏览(51)
  • Java中泛型和Object类型 初级进阶教程(一)

    在学习的过程中,常常看到某个类或者接口等中使用 ListT, TestT,其中T的作用是什么呢? 1 在类中使用泛型 2 使用多个泛型 3 在类中使用泛型 4 在方法中使用泛型 5 限制泛型类型 6 通配符 (Wildcard) 总结:泛型和Object类型之间的区别 类型安全: 泛型 T : 泛型提供了编译时类型

    2024年02月01日
    浏览(54)
  • 第8章-第1节-Java中的泛型(参数化类型)

    1、泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型? 2、概念:在类声明体中用到了类型参数。 3、泛型类只支持类类型,不支持基本数据类型(如int),但可以用包装类(如Integer ) 泛型标识 含义 T Type 类

    2024年01月23日
    浏览(45)
  • From Java To Kotlin 2:Kotlin 类型系统与泛型

    上期主要分享了 From Java To Kotlin 1 :空安全、扩展、函数、Lambda。 这是 From Java  to Kotlin   第二期。 From Java  to Kotlin  关键在于 思维的转变 。 Kotlin 中大部分语句是 表达式 。 表达式思维是一种编程思维。 编程思维是一种非常抽象的概念,很多时候是只可意会不可言传的。

    2024年02月08日
    浏览(55)
  • 【Java】泛型类,接口,方法

    泛型的作用:约束元素的类型 集合 泛型的符号: T:type E:element K:Key V:value 泛型符号是个占位符,给引用类型占位置 在使用的时候名称没有任何要求,ABCDEFG无所谓,个数也不要求 反省符号应用: 泛型类 在本类中,可以把泛型符号当成已知类型来用 泛型的具体类型在创

    2024年02月14日
    浏览(40)
  • Java实现方法接口入参同时包含文件、字段和对象等多种类型。HTTP请求返回415状态,Content type ‘application/octet-stream‘ not supported错误。

    方法一:对象不使用注解 使用Postman测试,直接将subject对象的字段填在key的位置 方法二:对象使用注解@RequestPart 使用Postman测试,将字段包装在subject对象里,使用Content type:application/json的内容类型 注:方法二在开发本地测试执行成功,但是在测试人员机子下不通过,执行报

    2024年02月12日
    浏览(41)
  • Java Date类型返回前端后 变成时间戳

    今天遇到这样一个问题,数据库查出来的数据是 Date 日期 和 Time时间。 但是传给前端就变成了 时间戳的格式 比如\\\"yyyy-MM-dd hh:mm:ss.000+0000\\\" 数据库查询如下 前端JSON格式如下 如果想直接转成前端想要的参数呢,有几种方法 ,比如Date类型查出来后 截取固定位置的方式返回给前端

    2024年02月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包