gson解析范型擦除问题

前提:已知

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,这样通过外部注入范型,可以避免上面的情况发生。

阅读 1.6k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题