java获取泛型的实际类型

这是一个困扰了我好久的问题,在我写的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() {
            @Override
            public void success(Object result) {
                //如果result为对象
                TestBean testBean = ((TestBean) result);
                //如果result为list
                List<TestBean> testBeans = (ArrayList<TestBean>) result;
            }

            @Override
            public void failure(String errorMessage) {
                System.out.println("errorMessage = " + errorMessage);
            }
        });

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

看代码:

 public static abstract class ResultCallback<T>
    {
        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<Person>直接返回
 HttpClient.post(response, new ResultCallBack<TestBean>() {
            @Override public void onSuccess(TestBean result) {
            }
        });

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

这里写图片描述

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

这里写图片描述

还有一点不明我测试了下

Gson Types.canonicalize(parameterized.getActualTypeArguments()[0]); 和
parameterized.getActualTypeArguments()[0]
打印的结果是一样的,去掉外面的一层包裹也能正常运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值