java 泛型 捕获转换_java获取泛型的实际类型

这是一个困扰了我好久的问题,在我写的

Object o;

if (result.charAt(0) == ‘{‘) {

//解析对象

o = new Gson().fromJson(result, clazz);

} else {

//这个方法是在stackoverflow中找到的可将json转换为list,普通的通过type去解析是不行的

o = new Gson().fromJson(result, com.google.gson.internal.$Gson$Types.newParameterizedTypeWithOwner(null, ArrayList.class, clazz));

}

listener.success(o);

返回的对象也只能是Object类型,具体用的时候还需要做一下强转

HttpClient.postRequest(this, "http://www.baidu.com", TestBean.class, map, new OnResponseListener() {

@Override

public void success(Object result) {

//如果result为对象

TestBean testBean = ((TestBean) result);

//如果result为list

List testBeans = (ArrayList) result;

}

@Override

public void failure(String errorMessage) {

System.out.println("errorMessage = " + errorMessage);

}

});

其实当时有想过用泛型来做,但就是不知如何获取泛型的实际类型,虽然已经比较简洁了,但是感觉还不太彻底,如果直接能得到对象就更好了,终于,皇天不负有心人,有大神解决了这个问题,前两天比较火的hongyang大神的OkHttpUtils的一篇文章关于json自动解析的这一块对我的帮助比较大,当然,我也顺便吐槽下,OkHttpUtils的封装并不能帮助大家更好的理解OkHttp,OkHttp的设计非常优秀,但是经过这么一封装,又和之前看到的快速开发框架无异,希望看的人也能多思考,可以借鉴其中优秀的地方,同时也要能看到不足的一面,不要盲目跟风。

看代码:

public static abstract class ResultCallback

{

Type mType;

public ResultCallback()

{

mType = getSuperclassTypeParameter(getClass());

}

/**

* 得到泛型T的实际Type

*/

static Type getSuperclassTypeParameter(Class> subclass)

{

Type superclass = subclass.getGenericSuperclass();

if (superclass instanceof Class)

{

throw new RuntimeException("Missing type parameter.");

}

ParameterizedType parameterized = (ParameterizedType) superclass;

return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);

}

}

使用

callBack.onSuccess(new Gson().fromJson(result, callBack.type));

这样就可以直接返回结果,如下:

//也支持List直接返回

HttpClient.post(response, new ResultCallBack() {

@Override public void onSuccess(TestBean result) {

}

});

这种方式可以简化不少的代码,但是Android Studio不是很给力,通常提示是这样的

2df8c7328462eb850bdbaa6cdd5ef24d.gif

完了还要移动鼠标手动去修改代码,比原来做一下强转也没有方便多少,但还是有办法的,还记得android Studio提供的活动模板(live template)的功能吗?Android Studio 使用技巧(三),这里来体验下它的强大之处,效果演示:

0f1fd4f7ca0f49912ef9d5472a01e9f3.gif

还有一点不明我测试了下

GsonTypes.canonicalize(parameterized.getActualTypeArguments()[0]); 和

parameterized.getActualTypeArguments()[0]

打印的结果是一样的,去掉外面的一层包裹也能正常运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值