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