1 解析泛型數(shù)據(jù)
當(dāng)使用JSON
進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)解析時(shí),我們通常希望往回調(diào)函數(shù)傳遞什么參數(shù),JSON
就能解析成相應(yīng)對(duì)象給我們。
我們來(lái)用偽代碼來(lái)看看網(wǎng)絡(luò)請(qǐng)求中解析泛型的過(guò)程是怎么樣的斗躏,網(wǎng)絡(luò)請(qǐng)求時(shí)层释,我們通常希望的過(guò)程是如下這個(gè)樣子:
Request request = new Request();
ResultCallBack callBack = new ResultCallBack<Fruit>(){
@Override
public void onResponseSuccess(Fruit fruit) {
LogUtils.d("fruit: " + fruit.price);
}
};
request.sendRequest(callBack);
而ResultCallBack的代碼也相當(dāng)簡(jiǎn)單,這里就只添加了成功返回時(shí)的方法笑陈,失敗的也類似际度。
public abstract class ResultCallBack<T> {
public abstract void onResponseSuccess(T t);
}
而請(qǐng)求的偽代碼如下:
public <T> void sendRequest(ResultCallBack<T> callBack) {
String result = "{\n" +
" \"price\": 12\n" +
"}";
// 獲取callBack類父類的類信息
Type callBackType = callBack.getClass().getGenericSuperclass();
if (callBackType != null) {
// 獲取泛型類型數(shù)組
Type[] array = ((ParameterizedType) callBackType).getActualTypeArguments();
Object obj = JSON.parseObject(result, array[0]);
callBack.onResponseSuccess((T) obj);
}
}
2 問(wèn)題
之前在網(wǎng)上看到有人問(wèn):為什么只有ResultCallBack
為抽象類時(shí),getGenericSuperclass
方法獲取的type
值才能轉(zhuǎn)換成ParameterizedType
類型并且獲得相應(yīng)的泛型類型涵妥。
其實(shí)想搞懂這個(gè)問(wèn)題乖菱,我們得先看看getGenericSuperclass
這個(gè)方法,它是表示返回父類的type類信息蓬网,當(dāng)ResultCallBack
為抽象類窒所,那所有由ResultCallBack
進(jìn)行初始化的類,全部都是ResultCallBack的子類帆锋,這樣getGenericSuperclass
方法才能獲取到ResultCallBack
的所有type
信息吵取,包括泛型信息。