我有一个回应课
public class ResponseModel<T> {
private boolean isRequestSuccessful;
public boolean getIsRequestSuccessful() {
return this.isRequestSuccessful;
}
public void setIsRequestSuccessful(boolean isRequestSuccessful) {
this.isRequestSuccessful = isRequestSuccessful;
}
private String message;
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
private T object;
public T getObject() {
return this.object;
}
public void setObject(T object) {
this.object = object;
}
}
我的API将返回类型T。我想解析API的响应并创建一个ResponseModel类型的对象。
我正在尝试实现类似以下的目标,而我可以使用C#轻松实现。请帮助如何使用Java做到这一点
public static ResponseModel<T> Get(String requestUri) throws ClientProtocolException,IOException {
CloseableHttpClient client = HttpClientBuilder.create().build();
HttpGet httpGet = new HttpGet(requestUri);
httpGet.addHeader("TenantKey", TenantKey);
httpGet.addHeader("accept", "application/json");
HttpResponse response = client.execute(httpGet);
ResponseModel<T> responseModel = new ResponseModel<T>();
if (response.getStatusLine().getStatusCode() == 200) {
Gson gson = new GsonBuilder().create();
// parse the response as T and and assign to object of ResponseModel
responseModel.object = ...
}
else
{
responseModel.message = response.getEntity().getContent();
}
// return ResponseModel here
}
最佳答案
C#和Java中的泛型完全不同。简而言之,您在这里所做的事情毫无意义。
您使用的Java通用T具有编译时功能。它允许您在编译时使用更特定的类型,而不是在各处使用Object
。
因此,您可能无法按预期在“运行时”使用泛型确定“ T”。方法中的T来自“外部”,编译器确定在其他情况下它有时应为ResponseModel<Integer>
和ResponseModel<Whatever>
。
您不能让gson读取JSON数据来为您返回特定的ResponseModel<Whatever>
。如果有的话,您也许可以使用TypeAdapter magic根据实际值进行一些切换,以返回该值或该特定的ResponseModel<Foo>
。
除此之外:当使用像bean这样的类作为ResponseModel时,您只是希望它们是特定的,而不是通用的。