美文网首页我爱编程
Java获得泛型参数类型

Java获得泛型参数类型

作者: flycode | 来源:发表于2018-05-26 17:31 被阅读0次

    在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);
    }
    

    相关文章

      网友评论

        本文标题:Java获得泛型参数类型

        本文链接:https://www.haomeiwen.com/subject/vbimjftx.html