创建参数化类型" Class"

时间:2012-12-10 12:59:06

标签: java generics gson

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

3 个答案:

答案 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私有类。