java 泛型参数的类型_Java获得泛型参数类型
在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获得泛型参数类型相关推荐
- java不可变类型_Java中的值类型:为什么它们不可变?
java不可变类型 值类型不必是不变的. 但是他们是. 在上一篇文章中,我讨论了Java中指针与引用之间的区别以及如何传递方法参数(按值传递或按引用传递). 这些与Java中尚不存在的值类型密切相关( ...
- java返回给前端的包装类型_Java当中的基本类型包装类
Java当中的基本类型包装类 01 基本数据类型对象的包装类 **什么是基本数据类型对象包装类呢?**就是把基本数据类型封装成对象,这样就可以提供更多的操作基本数值的功能了. 基本数据类型对象的包装类 ...
- Java+包裹类型_java中的包裹类型
包裹类型将一个基本数据类型的数据转换成对象的形式,从而使得它们可以像对象一样参与运算和传递.下表列出了基本数据类型所对应的包裹类型: 基本类型 包裹类型 boolean Boolean c ...
- java中的枚举类_java中的枚举类型
java中为了对参数类型使用限定,引入了泛型,实现了在编译期对参数类型是否合法的判断.同样,java为了对参数的值的限定,引入了枚举类,实现了在编译期对参数的值是否合法的判断. 首先我们用自定义类的方 ...
- java中comparator实现序列化_java – 确保Function参数是可序列化的最好方式是什么?...
我正在编写一个可序列化的类,它接受几个参数,包括一个函数: public class Cls implements Serializable { private final Collection _c ...
- java中 参数的调用_Java中的参数调用
Java程序设计语言使用值调用.也就是说.方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容. 下面说明下这种情况.假定一个方法试图将一个参数值增加至3倍: publi ...
- java 7种枚举类型_Java中的枚举类型
枚举类比较用 == 还是 equals,有啥区别? java 枚举值比较用 == 和 equals 方法没啥区别,两个随便用都是一样的效果.因为枚举 Enum 类的 equals 方法默认实现就是通过 ...
- java记录类型_Java中的记录类型
java记录类型 于2020年3月发布的JDK 14引入了记录 (预览语言功能),该记录提供了一种紧凑的语法来声明主要用于保存数据的类. 在记录中 ,所有低级,重复且容易出错的代码都类似于构造函数,访 ...
- java 设计char类型_JAVA中的char类型
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
最新文章
- CSS的表白:七夕巧克力心
- 西北工业大学matlab安装,西北工业大学Matlab实验报告.doc
- linux中wine yum安装,分享|在基于RedHat或Debian的系统上安装 Wine 1.7
- linux服务器操作系统
- Linux快捷键的使用
- Spring Security 5
- Maven 使用入门
- 怎么把音频合并在一起?
- 英雄联盟血条效果Shader
- vue3使用dayjs
- 小米捧红氮化镓快充?看完此文让你秒懂氮化镓!
- mysql 用update insert_mysql 一些insert/update的用法
- luajit集成篇/平台相关篇 | 合理用好lua+unity,更省性能的方案整理
- 利用新浪API实现数据的抓取\微博数据爬取\微博爬虫
- TC275旋变软解码仿真
- 使用husky配置git代码提交规范
- 简单谈谈如何提高后台管理系统的易用性、可操作性和人性化程度
- 求LCA的四种方法(暴力,倍增,RMQ+ST,Tarjan)
- Redis应用详解(一)分布式锁
- Python全局解释器锁(GIL)
热门文章
- Fine-tunning适用情况
- 二叉树分析(两点最大距离)
- 2021 ccpc 哈尔滨 G. Damaged Bicycle 状压 + 期望dp
- 201512-5 矩阵
- 理解至上:二叉堆与优先队列详细用法
- 无限序列 (ybtoj C.3)
- Loj#6039-「雅礼集训 2017 Day5」珠宝【四边形不等式,dp】
- UOJ#454-[UER #8]打雪仗【通信题】
- The 2020 ICPC Asia Macau Regional Contest A. Accelerator(分治+NTT)
- 【SPFA】桐人的约会