我正在尝试做这样的事情:
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;
}
答案 0 :(得分:1)
在GsonResponseProcessor
构造函数type erasure中已经发生,并且在运行时只存在一个版本的方法,其中类型变量T
已转换为Object
。
在Java中,只存在一个通用方法和类的版本,类型参数仅在编译时存在,在运行时将被Object
替换。
必须使用具体类型构造类型标记以捕获类型信息。这是他们的全部观点,用于在已知具体类型的地方捕获类型信息。然后,令牌可以存储在变量中,然后用于查找对象或通过反射获取类型信息。
这里的解决方案是知道具体类型的getResponseProcessor
调用者创建类型标记并将其作为参数传递。如果在您的情况下有效,您也可以传入Class
对象。但是,如果要将泛型类用作标记,就像在List<Dashboard>
的示例中一样,则需要一个类型标记。
这样的事情:
ResponseProcessor<List<String>> p = ResponseProcessorFactory.newResponseProcessor(new TypeToken<List<String>>() {});
答案 1 :(得分:1)
您可以通过将类类型作为方法参数传递来解决类型擦除问题。
public class ResponseProcessorFactory {
public static <T> ResponseProcessor<T> newResponseProcessor(Class<T> type){
return new GsonResponseProcessor<T>(type);
}
}
public class GsonResponseProcessor<T> implements ResponseProcessor<T> {
protected T response;
protected TypeToken typeToken;
public GsonResponseProcessor(Class<T> type) {
this.typeToken = TypeToken.get(type);//depends on the API version
//this.typeToken = new TypeToken<T>(type);
//this.typeToken = TypeToken.of(type);
}
@Override
public void parse(String jsonString) throws JSONException, IOException {
response = GsonHelper.getGsonInstance().fromJson(jsonString, typeToken.getType());
}
public T getResponse() {
return response;
}
}
答案 2 :(得分:0)
您是否尝试过将签名更改为正确的类型?
private ResponseProcessor<List<String>> getResponseProcessor() {
return ResponseProcessorFactory.newResponseProcessor();
}