FastJSON的parseObject使用模板方法该怎么进行强制转换?

TAT_Hins 2019-04-17 03:25:58
各位大佬们请问一下,在FastJSON的parseObject方法里,转换类型想要使用类似于TypeReference<T extends AccessResult>这样的方法,AccessResult是一个父类,实际的类型是它的子类,但是我发现如果用以下的转换语句:
T retObj = JSON.parseObject(response.body().string(), new TypeReference<T>(){});

就会在此处跳出ClassCastException报错,JSONObject无法转换为AccessResult。而如果我写成:
T retObj = (T) JSON.parseObject(response.body().string(), new TypeReference<AccessResult>(){});

则不会报错,但生成的retObj为AccessResult类型,而实际上我需要它是AccessResult的子类UserAccessResult,向下强制转换的话同样会报错AccessResult无法转换为UserAccessResult。请问我该怎么做?
以下是代码:
1. 这是父类和子类,原本我想直接把AccessResult写成泛型的,因为AccessResult其实是网络请求返回结果的载体,responseBody实际上是根据需要返回不同的Bean对象。

public class AccessResult {

private Boolean result;

private String status;

protected Object responseBody;

public void setResult(Boolean result){
this.result = result;
}

public Boolean getResult(){
return this.result;
}

public void setStatus(String status) {
this.status = status;
}

public String getStatus() {
return this.status;
}

protected void setResponseBody(Object responseBody) {
this.responseBody = responseBody;
}

protected Object getResponseBody() {
return this.responseBody;
}
}

public class UserAccessResult extends AccessResult {

private User user = (User) responseBody;

public void setUser(User user) {
this.user = user;
}

public User getUser() {
return this.user;
}

}

2. 这是具体实现代码

public static <T extends AccessResult> T post(Object params, String url){
……
// 初始化返回对象
T retObj = null;
try {
//创建调用对象,重写回调函数
Response response = okHttpClient.newCall(request).execute();

if (response.isSuccessful()){
// success
retObj = JSON.parseObject(response.body().string(), new TypeReference<T>(){});
response.body().close();
}
else {
response.body().close();
throw new IOException("Unexpected code " + response);
}
} catch (NullPointerException | IOException e){
e.printStackTrace();
} catch (Exception e){
e.printStackTrace();
} finally {
return retObj;
}
}


UserAccessResult result = NetCommunication.post(u, getString(R.string.server_host_url) + "/login");
if (result != null && result.getResult()) {
app.setCurrentUser(result.getUser());
return true;
} else return false;
...全文
618 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
TAT_Hins 2019-04-17
  • 打赏
  • 举报
回复
想不到好的方法,只能用传参的方法来解决了

UserAccessResult result = NetCommunication.post(u, getString(R.string.server_host_url) + "/login", new UserAccessResult());

public static <T extends AccessResult<? extends Object>> T post(Object params, String url, T ret){
  ……
  if (response.isSuccessful()){
    //success
    ret = (T) JSON.parseObject(response.body().string(), ret.getClass());
    response.body().close();
  }
  ……
}

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧