Java获得泛型参数类型

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

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

那如何来获取type呢?

接口实现

public interface ICallback<T> {
    void onSuccess(T t);
    void onFailure(String msg);
}

对于一个ICallback<T>类型的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<T> {
    protected abstract void onSuccess(T t);
    protected abstract void onFailure(String msg);
}

同样,对于一个AbstractCallback<T>类型的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);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,869评论 18 139
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 2,019评论 0 3
  • urllib模块 作用 主要用于从网页上抓取数据。以及封装了一些常用的URL编码解码函数 使用方法 最简单的使用,...
    宁静的夜阅读 2,729评论 0 2
  • 1 龟兔的故事是每个人都熟悉的,为什么比赛的最后是乌龟赢了,而不是兔子呢?跑的快的还没有跑的慢的跑的远? 兔子会输...
    孤星一城阅读 275评论 0 0
  • 今天早上到上海出差,4点钟就起来了,在路上参加了小组会,听到了常春清文志云王晓广新紫娟的分享和现发助教的贡献,感受...
    罗洪绮阅读 158评论 1 3