1

我发现我的 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 吗?

4

3 回答 3

1

不要传入要包装在响应中的类,而是将其指定为方法级别的泛型参数。

public <T> T submitUrl(String url) throws AjApiException {
    Type typeOfT = new TypeToken<RestResponse<T>>(){}.getType();
}
于 2012-12-10T13:03:43.133 回答
0

我最终传递了类型而不是类。这解决了问题。

我相信您可以通过执行以下操作来创建类型:

Type typeOfT = new TypeToken<RestResponse<T>>(){}.getType();
于 2012-12-17T10:42:19.070 回答
-1

最简单的方法是方法的调用者,而不是传入一个Class对象,而是传入一个Type对应于RestResponse<Whatever>; 他们可能会使用这个TypeToken东西来做到这一点。

否则,您可以自己构建Type(特别是 a ParameterizedType)。您要么需要创建自己的实现类ParameterizedType,要么复制ParameterizedTypeImpl某些项目中使用的私有类。

于 2012-12-10T20:14:34.197 回答