我已经发现我的GSON问题都是因为,虽然我的返回类型不是参数化对象,但应该是。现在我需要使用Gson.fromJson方法和参数类型来指定返回类型,以便GSON为我处理它。
我创建了一个名为RestResponse的泛型类:
public class RestResponse<T> {
private String errorMessage;
private int errorReason;
private T result;
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "RestResponse [errorMessage=" + errorMessage + ", result=" + result + "]";
}
/**
* Does this response contain an error?
* @return true if in error
*/
public boolean isInError(){
return getErrorMessage()!=null;
}
/**
* @return the errorMessage
*/
public String getErrorMessage() {
return errorMessage;
}
/**
* @param errorMessage the errorMessage to set
*/
public void setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
}
/**
* The error reason code
* @return the errorReason
*/
public int getErrorReason() {
return errorReason;
}
/**
* The error reason code
* @param errorReason the errorReason to set
*/
public void setErrorReason(int errorReason) {
this.errorReason = errorReason;
}
/**
* The result of the method call
* @return the result or null if nothing was returned
*/
public final T getResult() {
return result;
}
/**
* The result of the method call
* @param result the result to set or null if nothing was returned
*/
public final void setResult(T result) {
this.result = result;
}
}
现在我想在另一边创建结果类型。我有一个泛型方法,我用来解码这些东西,抛出异常或返回结果。
所以我的方法是这样的:
public Object submitUrl(String url, Class<?> clazz) throws AjApiException {
clazz是将在RestResponse上指定的类型。
然后在传递给GSON之前创建RestResponse:
Type typeOfT = new TypeToken<RestResponse<clazz>>(){}.getType(); //1-->What goes here?
RestResponse<clazz> restResponse; //2-->and here?
它错了。有人可以告诉我这些地方的内容代替了clazz吗?
答案 0 :(得分:1)
不要传入要包装在响应中的类,而是将其指定为方法级通用参数。
public <T> T submitUrl(String url) throws AjApiException {
Type typeOfT = new TypeToken<RestResponse<T>>(){}.getType();
}
答案 1 :(得分:0)
我最终传入的是类型而不是类。这解决了这个问题。
我相信你可以通过以下方式创建类型:
Type typeOfT = new TypeToken<RestResponse<T>>(){}.getType();
答案 2 :(得分:-1)
最简单的方法是让方法的调用方(而不是传入Class
个对象)传入与Type
对应的RestResponse<Whatever>
;他们可能会使用TypeToken
这样做。
否则,您可以自己构建Type
(特别是ParameterizedType
)。您可能需要创建自己的实现ParameterizedType
的类,或者复制某些项目中使用的ParameterizedTypeImpl
私有类。