在Android开发中,使用Gson将json字符串转换为Java对象尤为常见。在这个转换过程中,通常会结合泛型参数、接口或者抽象类来封装处理。

T t = new Gson().fromJson(response, type);

那如何来获取type呢?

接口实现

public interface ICallback {

void onSuccess(T t);

void onFailure(String msg);

}

对于一个ICallback类型的callback而言:

// 返回实现的接口

Type[] genericInterfaces = callback.getClass().getGenericInterfaces();

if (genericInterfaces[0] instanceof ParameterizedType) {

ParameterizedType parameterizedType = (ParameterizedType) (genericInterfaces[0]);

// 仅包含一个泛型参数

Type type = parameterizedType.getActualTypeArguments()[0];

// T为String

if (type instanceof Class && TextUtils.equals(((Class>) type).getName(), String.class.getName())) {

callback.onSuccess((T) response);

return;

}

try {

T t = new Gson().fromJson(response, type);

callback.onSuccess(t);

} catch (Exception e) {

callback.onFailure("解析失败");

}

}else {

// 无泛型参数

callback.onSuccess((T) response);

}

抽象类实现

public abstract class AbstractCallback {

protected abstract void onSuccess(T t);

protected abstract void onFailure(String msg);

}

同样,对于一个AbstractCallback类型的callback而言:

Type superclass = callback.getClass().getGenericSuperclass();

if (superclass instanceof ParameterizedType) {

ParameterizedType parameterizedType = (ParameterizedType) superclass;

// 仅包含一个泛型参数

Type type = parameterizedType.getActualTypeArguments()[0];

// T为String

if (type instanceof Class && TextUtils.equals(((Class>) type).getName(), String.class.getName())) {

callback.onSuccess((T) response);

return;

}

try {

T t = new Gson().fromJson(response, type);

callback.onSuccess(t);

} catch (Exception e) {

callback.onFailure("解析失败");

}

} else {

// 无泛型参数

callback.onSuccess((T) response);

}

java 泛型参数的类型_Java获得泛型参数类型相关推荐

  1. java不可变类型_Java中的值类型:为什么它们不可变?

    java不可变类型 值类型不必是不变的. 但是他们是. 在上一篇文章中,我讨论了Java中指针与引用之间的区别以及如何传递方法参数(按值传递或按引用传递). 这些与Java中尚不存在的值类型密切相关( ...

  2. java返回给前端的包装类型_Java当中的基本类型包装类

    Java当中的基本类型包装类 01 基本数据类型对象的包装类 **什么是基本数据类型对象包装类呢?**就是把基本数据类型封装成对象,这样就可以提供更多的操作基本数值的功能了. 基本数据类型对象的包装类 ...

  3. Java+包裹类型_java中的包裹类型

    包裹类型将一个基本数据类型的数据转换成对象的形式,从而使得它们可以像对象一样参与运算和传递.下表列出了基本数据类型所对应的包裹类型: 基本类型    包裹类型 boolean    Boolean c ...

  4. java中的枚举类_java中的枚举类型

    java中为了对参数类型使用限定,引入了泛型,实现了在编译期对参数类型是否合法的判断.同样,java为了对参数的值的限定,引入了枚举类,实现了在编译期对参数的值是否合法的判断. 首先我们用自定义类的方 ...

  5. java中comparator实现序列化_java – 确保Function参数是可序列化的最好方式是什么?...

    我正在编写一个可序列化的类,它接受几个参数,包括一个函数: public class Cls implements Serializable { private final Collection _c ...

  6. java中 参数的调用_Java中的参数调用

    Java程序设计语言使用值调用.也就是说.方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容. 下面说明下这种情况.假定一个方法试图将一个参数值增加至3倍: publi ...

  7. java 7种枚举类型_Java中的枚举类型

    枚举类比较用 == 还是 equals,有啥区别? java 枚举值比较用 == 和 equals 方法没啥区别,两个随便用都是一样的效果.因为枚举 Enum 类的 equals 方法默认实现就是通过 ...

  8. java记录类型_Java中的记录类型

    java记录类型 于2020年3月发布的JDK 14引入了记录 (预览语言功能),该记录提供了一种紧凑的语法来声明主要用于保存数据的类. 在记录中 ,所有低级,重复且容易出错的代码都类似于构造函数,访 ...

  9. java 设计char类型_JAVA中的char类型

    1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a';  //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...

最新文章

  1. CSS的表白:七夕巧克力心
  2. 西北工业大学matlab安装,西北工业大学Matlab实验报告.doc
  3. linux中wine yum安装,分享|在基于RedHat或Debian的系统上安装 Wine 1.7
  4. linux服务器操作系统
  5. Linux快捷键的使用
  6. Spring Security 5
  7. Maven 使用入门
  8. 怎么把音频合并在一起?
  9. 英雄联盟血条效果Shader
  10. vue3使用dayjs
  11. 小米捧红氮化镓快充?看完此文让你秒懂氮化镓!
  12. mysql 用update insert_mysql 一些insert/update的用法
  13. luajit集成篇/平台相关篇 | 合理用好lua+unity,更省性能的方案整理
  14. 利用新浪API实现数据的抓取\微博数据爬取\微博爬虫
  15. TC275旋变软解码仿真
  16. 使用husky配置git代码提交规范
  17. 简单谈谈如何提高后台管理系统的易用性、可操作性和人性化程度
  18. 求LCA的四种方法(暴力,倍增,RMQ+ST,Tarjan)
  19. Redis应用详解(一)分布式锁
  20. Python全局解释器锁(GIL)

热门文章

  1. Fine-tunning适用情况
  2. 二叉树分析(两点最大距离)
  3. 2021 ccpc 哈尔滨 G. Damaged Bicycle 状压 + 期望dp
  4. 201512-5 矩阵
  5. 理解至上:二叉堆与优先队列详细用法
  6. 无限序列 (ybtoj C.3)
  7. Loj#6039-「雅礼集训 2017 Day5」珠宝【四边形不等式,dp】
  8. UOJ#454-[UER #8]打雪仗【通信题】
  9. The 2020 ICPC Asia Macau Regional Contest A. Accelerator(分治+NTT)
  10. 【SPFA】桐人的约会