账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    gson解析范型擦除问题
    35
    0

    前提:已知

    Type typeOfObjectsListNew = new TypeToken<ArrayList<T>>() {}.getType();

    范型T会被擦除。正确写法是新建一个type对象,实现ParameterizedType接口,把Type类型传进去。

     @Override
        public Type[] getActualTypeArguments() {
            return new Type[] {type};
        }
    
        @Override
        public Type getRawType() {
            return ArrayList.class;
        }
    
        @Override
        public Type getOwnerType() {
            return null;
        }

    问题来了:
    看了源码,两者区别主要在于TokenType的构造函数里,错误写法是通过传进去的 Class调用 getgencirSuperClass(), 得到其 超类 及 <具体范型T> 。目前大概理解是这一阶段在经过编译后,具体范型被擦除,导致此函数返回null(还是Object?)?。从而无法获取下一步的Type.
    而正确写法是直接传进去了指定的Type (不需要通过class来获取type了?),从而避免了范型擦除带来的影响?
    以上是我自己看代码的理解,感觉有点模糊。还请大家指点一二。讲的再细一点,谢谢!

    另外,目前自己采用的是 AA+动态代理+反射来请求和解析,在请求构建参数的时候通过反射拿到网络回调callback<T>的T(具体单一请求的解析dto),在请求回来的时候拿T去解析jsonobject,这样通过外部注入范型,可以避免上面的情况发生。

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 夜雨离风 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部