public abstract class VfNetCallback<T> extends AbsCallback<VfNetResponse<T>> {
@Override
public VfNetResponse<T> parseNetworkResponse(Response response, int id) throws Exception {
VfNetResponse<T> netResponse = JSON.parseObject(response.body().toString(), VfNetResponse<T>.class);
return netResponse;
}
}
如上,想在parseNetworkResponse中针对VfNetResponse < T >.class进行解析,求问应该如何处理? 已知通过 Class< T > dataClass = (Class < T >) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 可以获取T对应的class。但现在想获取VfNetResponse< T >.class传入fastjson进行直接解析。
11条答案
按热度按时间cmssoen21#
因为这种动态泛型是拿不到的~ 你一定要动态可以自己new一个ParameterizedTypeImpl当参数,不过据说如果不自己缓存ParameterizedTypeImpl对象会导致内存泄露
kx1ctssn2#
https://github.com/alibaba/fastjson/wiki/TypeReference
看这个文档是否对你有帮助
oug3syen3#
他的问题是T这种不确定的类型在运行时是直接被当作Object对待的, 如果写成, 则T一律被当作X对待,反正就是当不到真正的T的~
vom3gejh4#
两种办法,一个是json里序列化的时候就带上@type,二是TypeRef
tez616oj5#
@lcl6 你这个文件解决了吗,我碰到同样的问题
hts6caw36#
遇到类似同样的问题。
如上,想在parseNetworkResponse中针对VfNetResponse < T >.class进行解析,求问应该如何处理?
已知通过 Class< T > dataClass = (Class < T >) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 可以获取T对应的class。但现在想获取VfNetResponse< T >.class传入fastjson进行直接解析。
qhhrdooz7#
JSON.parseObject(json, new TypeReference( theClassOfT) );
In case of more than one ParameterizedType :
JSON.parseObject(json, new TypeReference<VfNetResponse<T, B>>( theClassOfT, theClassOfB) );
xnifntxz8#
找到办法了。
jexiocij9#
确实解决问题了,感谢。
定义子类,在子类明确中指定泛型的类型, 类似这样:
public class ParamParser extends AbstractParser<TestLoginParam>
我理解泛型类型不能完全动态的,ParameterizedType 这个类型也没办法new出来,只能先声明再获取, 定义多个子类,也算实现了动态。
xqk2d5yq10#
使用子类A构造方法,间接传递泛型到父类B中,对序列化部分进行指定。
llew8vvj11#