我正在尝试做这样的事情:
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
构造函数中发生了类型擦除,并且在运行时仅存在方法的一种版本,并将类型变量T
转换为Object
。
在Java中,将仅存在一种通用方法和类的版本,类型参数仅在编译时存在,并Object
在运行时被替换。
类型令牌必须使用具体的类型来构造,以捕获类型信息。这就是他们的重点,目的是在已知具体类型的地方捕获类型信息。然后可以将令牌存储在变量中,以后再用于查找对象或通过反射获取类型信息。
此处的解决方案是,getResponseProcessor
知道具体类型的调用者将创建类型令牌并将其作为参数传递。Class
如果在您的情况下可行,您也可以传递一个对象。但是,如果您想将通用类用作标记,则在您的示例中,List<Dashboard>
您将需要一个类型标记。
像这样的东西:
ResponseProcessor<List<String>> p = ResponseProcessorFactory.newResponseProcessor(new TypeToken<List<String>>() {});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句