1 解析泛型数据
当使用JSON
进行网络数据解析时,我们通常希望往回调函数传递什么参数,JSON
就能解析成相应对象给我们。
我们来用伪代码来看看网络请求中解析泛型的过程是怎么样的,网络请求时,我们通常希望的过程是如下这个样子:
Request request = new Request();
ResultCallBack callBack = new ResultCallBack<Fruit>(){
@Override
public void onResponseSuccess(Fruit fruit) {
LogUtils.d("fruit: " + fruit.price);
}
};
request.sendRequest(callBack);
而ResultCallBack的代码也相当简单,这里就只添加了成功返回时的方法,失败的也类似。
public abstract class ResultCallBack<T> {
public abstract void onResponseSuccess(T t);
}
而请求的伪代码如下:
public <T> void sendRequest(ResultCallBack<T> callBack) {
String result = "{\n" +
" \"price\": 12\n" +
"}";
// 获取callBack类父类的类信息
Type callBackType = callBack.getClass().getGenericSuperclass();
if (callBackType != null) {
// 获取泛型类型数组
Type[] array = ((ParameterizedType) callBackType).getActualTypeArguments();
Object obj = JSON.parseObject(result, array[0]);
callBack.onResponseSuccess((T) obj);
}
}
2 问题
之前在网上看到有人问:为什么只有ResultCallBack
为抽象类时,getGenericSuperclass
方法获取的type
值才能转换成ParameterizedType
类型并且获得相应的泛型类型。
其实想搞懂这个问题,我们得先看看getGenericSuperclass
这个方法,它是表示返回父类的type类信息,当ResultCallBack
为抽象类,那所有由ResultCallBack
进行初始化的类,全部都是ResultCallBack的子类,这样getGenericSuperclass
方法才能获取到ResultCallBack
的所有type
信息,包括泛型信息。