当前位置: 首页 > news >正文

网站制作的教程建设热电偶网站

网站制作的教程,建设热电偶网站,娱乐网站设计与实现,网易163企业邮箱官网文章目录引言Type是什么获取类型的困惑自定义TypeToken解决问题总结引言 Gson在Json解析中使用广泛, 常用的数据类型都可以解析, 特殊的可以自定义Adapter解析. 在解析大量具有某些相同结构的数据上,我们总想复用已有的类型, 为了复用通常可以使用继承和泛型. 比如服务端返回的… 文章目录引言Type是什么获取类型的困惑自定义TypeToken解决问题总结引言 Gson在Json解析中使用广泛, 常用的数据类型都可以解析, 特殊的可以自定义Adapter解析. 在解析大量具有某些相同结构的数据上,我们总想复用已有的类型, 为了复用通常可以使用继承和泛型. 比如服务端返回的json都有类似结构: {code:200,message:success,data:{...} }其中data对应的结构不定, 一种考虑是使用泛型: public class ResponseT{public T data;//简化数据, 省略了其他字段 }于是在做json解析是很可能会这样使用: String json {\data\:\data from server\}; Type type new TypeTokenResponseString(){}.getType(); ResponseString result new Gson().fromJson(json, type);这个TypeToken是如何和类型Response产生关系,又是怎样存储泛型信息的? 首先需要明确Type是什么. Type是什么 这里的Type指java.lang.reflect.Type, 是Java中所有类型的公共高级接口, 代表了Java中的所有类型. Type体系中类型的包括数组类型(GenericArrayType)、参数化类型(ParameterizedType)、类型变量(TypeVariable)、通配符类型(WildcardType)、原始类型(Class)、基本类型(Class), 以上这些类型都实现Type接口. 参数化类型,就是我们平常所用到的泛型List、Map 数组类型,并不是我们工作中所使用的数组String[] 、byte[]而是带有泛型的数组即T[] 通配符类型, 指的是?, ? extends T等等 原始类型, 不仅仅包含我们平常所指的类还包括枚举、数组、注解等 基本类型, 也就是我们所说的java的基本类型即int,float,double等 本文的重点在于参数化类型(ParameterizedType). public interface ParameterizedType extends Type {// 返回确切的泛型参数, 如MapString, Integer返回[String, Integer]Type[] getActualTypeArguments();//返回当前class或interface声明的类型, 如List?返回ListType getRawType();//返回所属类型. 如,当前类型为OT.IS, 则返回OT. 顶级类型将返回null Type getOwnerType(); }获取类型的困惑 对于普通的类想要获取类型简单调用.class或者getClass()方法即可, ClassString stringClass String.class; Class? stringClass2 hello.getClass();但对于泛型你不能这样做, ResponseString.class //不能通过编译 Response.class //只能这样获取类型, 但无法知道元素的类型那么在做json解析时我们如果确实是需要让Gson解析成Response, 可以像上文的方式处理. 自定义TypeToken 先看一段代码: import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type;public abstract class MyTypeTokenT {private final Type type;public MyTypeToken() {Type genericSuperclass getClass().getGenericSuperclass();if(genericSuperclass instanceof Class){throw new RuntimeException(Missing type parameter.);}ParameterizedType parameterizedType (ParameterizedType) genericSuperclass;Type[] typeArguments parameterizedType.getActualTypeArguments();type typeArguments[0];}public Type getType() {return type;} }MyTypeToken声明为抽象类, 使用时需要对其进行实例化, 实例化过程可以分解如下: MyTypeTokenString sToken new MyTypeTokenString(){};相当于 class MyTypeToken$0 extends MyTypeTokenString{} MyTypeTokenString sToken new MyTypeToken$0(); 这样分解的目的在于明确sToken的类型是MyTypeToken$0(匿名的),父类型是MyTypeToken而不是MyTypeToken. getClass().getSuperclass()获取的是当前对象所属的类型的父类型. 注意到抽象类实例化时需要给具体的泛型类, 如果没有提供则使用Object(但此时使用的已不是泛型类了, 而是原始类型, 也就是擦除泛型后的类型)代替泛型参数. 因此如果像上面那样实例化, 那么getClass().getGenericSuperclass()得到的将是类型参数实例化后的父类型MyTypeToken, 泛型信息保留下来了. 如果不用泛型得到的是MyTypeToken, 是原始类型. 得到泛型参数实例化后的类型, getActualTypeArguments()返回的是确切的类型参数数组, 此处MyTypeToken只有一个类型参数, 返回的是数组[String.class]. 至此, 通过new MyTypeToken() {}.getType()得到的正是表示Response的类型, 将该类型应用在Gson在解析Response上将获得和TypeToken一致的效果(当然就这么点代码功能肯定是比不上了). 解决问题 探究TypeToken的目的其实为了解决以下问题而总结的. //封装getType()操作 public class TokenUtil{public static E Type getType(){return new MyTypeTokenE() {}.getType();} } // 本意在于获取ResponseString的类型, 但是new MyTypeTokenE() {}时已经实现了 // 抽象类, 相当于创建一个子类 class MyTypeToken$0E extends MyTypeTokenE{}, // 实例化时虽然传入的是ResponseString, 但.getGenericSuperclass()MyTypeToken$0E // 于是getType()返回的只是泛型参数类型E, 正真解析是按照Gson流程选择Map或者List Type type TokenUtil.ResponseStringgetType(); // fromJson返回Map或者List, ClassCastException! ResponseString o new Gson().fromJson(json, type);总结 Gson解析时TypeToken的泛型参数只能使用时传入确切的类型才能获取正确的Type, 这也是TypeToken设计成抽象类的巧妙之处和原因改为只有protected构造方法的普通类原理一样. 一旦将TypeToken改成普通类, 根据上面的分析, 一切类型信息都被擦除, Gson解析将得不到预期的类型.
http://www.sadfv.cn/news/36425/

相关文章:

  • 手机网站微信支付接口开发教程私人找人做网站
  • 网站规划与网页设计第四版电子书wordpress手机站模板
  • 故乡网站开发的意义Wordpress需要费用吗
  • ps怎么做网站淘宝入驻网站建设
  • 内网建设网站网站二级域名建站属于子站吗
  • 个人网站建设模板简洁图片sem优化托管
  • 南京装饰公司网站建设做电影平台网站怎么赚钱的
  • 湛江做网站从做微信文章的网站
  • 网络舆情监测 toom优化网站 提高查询
  • 建设银行网站维护电话乐清网站建设公司
  • 优秀网站设计参考wordpress 大气模板下载
  • 潍坊网站开发招聘信息页面设计公司招聘
  • 芜湖北京网站建设个人创业众筹平台
  • 中国建设企业网站wordpress network
  • 合肥有多少做网站的搜索指数的数据来源
  • 自适应影视网站模板idc网站备案
  • 中英文网站开发公司站长网站统计
  • 网站建设需要考虑的问题萝岗区网站建设推广
  • 免费做问卷的网站好网站建设沈阳公司哪家好
  • 国内公司网站需要备案手机活动网站模板
  • 哪家公司网站做的好重庆网站建站一站式服务
  • 建设网站如何加入搜索关键词搜索站长工具
  • 物流网站怎么开建设工程施工合同通用条款
  • 网页制作网站建设it项目管理软件排名
  • 国内十个免费自学网站科学家做实验的网站
  • 深圳南山网的工作惠州seo外包平台
  • 网站开发的安全策略电商网站前台模块
  • 单页网站源码下载做一个电商网站
  • 做申诉资料网站网站的外链建设计划
  • 一家企业如何建设自己的网站 下载南昌专业网站制作公司