gpt4 book ai didi

java - 传递泛型类型的问题

转载 作者:行者123 更新时间:2023-11-30 03:43:49 24 4
gpt4 key购买 nike

我正在尝试做这样的事情:

public class ResponseProcessorFactory {

public static <T> ResponseProcessor<T> newResponseProcessor(){
return new GsonResponseProcessor<T>();
}
}

public class GsonResponseProcessor<T> implements ResponseProcessor<T> {

protected T response;
protected TypeToken typeToken;

public GsonResponseProcessor() {
this.typeToken = new TypeToken<T>(){};
}

@Override
public void parse(String jsonString) throws JSONException, IOException {
response = GsonHelper.getGsonInstance().fromJson(jsonString, typeToken.getType());
}

public T getResponse() {
return response;
}
}


private void ResponseProcessor getResponseProcessor(){
return ResponseProcessorFactory<List<String>>.newResponseProcessor();
}

现在,每当我调用getResponseProcessor()时,它不会返回 List<String> 的响应处理器。相反,它返回 Object 的默认响应处理器。 .

我确定,我缺少一些有关泛型的概念。谁能详细解释一下吗?

编辑:真正的用法是这样的:

   public BaseRequestWithResponseProcessor<List<Dashboard>> getDashboards(Listener<List<Dashboard>> responseListener, ErrorListener errorListener) {
String url = mBaseUrl + "/dashboard";

ResponseProcessor<List<Dashboard>> responseProcessor = ResponseProcessorFactory.newResponseProcessor();

AuthInfo authInfo = getAuthInfo();
BaseRequestWithResponseProcessor<List<Dashboard>> request = new BaseRequestWithResponseProcessor<List<Dashboard>>(
Method.GET, url, authInfo, null, responseProcessor, responseListener, errorListener);
return request;
}

最佳答案

GsonResponseProcessor构造函数type erasure已经发生,并且在运行时只有一个版本的方法将存在,其类型变量为 T转换为Object .

在 Java 中,仅存在一种版本的泛型方法和类,类型参数仅在编译时存在,并将被 Object 替换。在运行时。

类型标记必须使用具体类型来构造以捕获类型信息。这就是它们的全部意义,在已知具体类型的地方捕获类型信息。然后可以将 token 存储在变量中,稍后用于查找对象或通过反射获取类型信息。

这里的解决方案是 getResponseProcessor 的调用者知 Prop 体类型的人创建类型标记并将其作为参数传递。您还可以传入 Class如果这适用于您的情况,则反对。但是,如果您想使用泛型类作为标记,如您的示例中 List<Dashboard> 所示您将需要一个类型 token 。

类似这样的事情:

ResponseProcessor<List<String>> p = ResponseProcessorFactory.newResponseProcessor(new TypeToken<List<String>>() {});

关于java - 传递泛型类型的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26234112/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com