首页 / JAVA / java获取泛型的实际类型
java获取泛型的实际类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java获取泛型的实际类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2414字,纯文字阅读大概需要4分钟。
内容图文
![java获取泛型的实际类型](/upload/InfoBanner/zyjiaocheng/1094/f1e2b58d423b425ca8134ed3b074e37d.jpg)
这是一个困扰了我好久的问题,在我写的android请求框架总结(二)中写到过利用框架自动解析json数据,代码如下
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() {
@Overridepublicvoidsuccess(Object result) {
//如果result为对象
TestBean testBean = ((TestBean) result);
//如果result为list
List<TestBean> testBeans = (ArrayList<TestBean>) result;
}
@Overridepublicvoidfailure(String errorMessage) {
System.out.println("errorMessage = " + errorMessage);
}
});
其实当时有想过用泛型来做,但就是不知如何获取泛型的实际类型,虽然已经比较简洁了,但是感觉还不太彻底,如果直接能得到对象就更好了,终于,皇天不负有心人,有大神解决了这个问题,前两天比较火的hongyang大神的OkHttpUtils的一篇文章关于json自动解析的这一块对我的帮助比较大,当然,我也顺便吐槽下,OkHttpUtils的封装并不能帮助大家更好的理解OkHttp,OkHttp的设计非常优秀,但是经过这么一封装,又和之前看到的快速开发框架无异,希望看的人也能多思考,可以借鉴其中优秀的地方,同时也要能看到不足的一面,不要盲目跟风。
看代码:
public static abstractclassResultCallback<T>
{
Type mType;
public ResultCallback()
{
mType = getSuperclassTypeParameter(getClass());
}
/**
* 得到泛型T的实际Type
*/
static Type getSuperclassTypeParameter(Class<?> subclass)
{
Type superclass = subclass.getGenericSuperclass();if (superclassinstanceofClass)
{
thrownew RuntimeException("Missing type parameter.");
}
ParameterizedType parameterized = (ParameterizedType) superclass;
return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
}
}
使用
callBack.onSuccess(new Gson().fromJson(result, callBack.type));
这样就可以直接返回结果,如下:
//也支持List<Person>直接返回
HttpClient.post(response, new ResultCallBack<TestBean>() {
@OverridepublicvoidonSuccess(TestBean result) {
}
});
这种方式可以简化不少的代码,但是Android Studio不是很给力,通常提示是这样的
完了还要移动鼠标手动去修改代码,比原来做一下强转也没有方便多少,但还是有办法的,还记得android Studio提供的活动模板(live template)的功能吗?Android Studio 使用技巧(三),这里来体验下它的强大之处,效果演示:
还有一点不明我测试了下
parameterized.getActualTypeArguments()[0]
打印的结果是一样的,去掉外面的一层包裹也能正常运行
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/djk_dong/article/details/48026115
内容总结
以上是互联网集市为您收集整理的java获取泛型的实际类型全部内容,希望文章能够帮你解决java获取泛型的实际类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。