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获得泛型参数类型)