我有一个定义为:
的类DoIndependentWork()
在此课程中,有一个方法public class Calls<T extends Object>
可为Gson请求创建doRequest
(来自TypeToken
)。
com.google.json.reflect
其中java.lang.reflect.Type type = new TypeToken<HandlerResponse<T>>(){{}}.getType();
是一个包含以下属性的简单模型类:
HandlerResponse
我在Android Studio上遇到的例外是:
private Map detail;
private transient T data;
private transient int count = 0;
private String status;
在TypeToken的实例化时崩溃(我以为可能正在丢失T类的Java类型擦除的原因)。
我将FATAL EXCEPTION: main
Process: PID: 32628
java.lang.AssertionError: illegal type variable reference
at libcore.reflect.TypeVariableImpl.resolve(TypeVariableImpl.java:111)
at libcore.reflect.TypeVariableImpl.getGenericDeclaration(TypeVariableImpl.java:125)
at libcore.reflect.TypeVariableImpl.hashCode(TypeVariableImpl.java:47)
at java.util.Arrays.hashCode(Arrays.java:4153)
at com.google.gson.internal.$Gson$Types$ParameterizedTypeImpl.hashCode($Gson$Types.java:479)
at com.google.gson.reflect.TypeToken.<init>(TypeToken.java:64)
at com.company.server.Calls$4.<init>(Calls.java:244)
的实例创建为:
Calls
答案 0 :(得分:1)
解决了,我按如下方式修改了实现:
public class Calls<T> {
public Calls(Type type, Class classTypeResponse) {
this.type = type;
this.classTypeResponse = classTypeResponse;
}
doRequest(...) { ... }
...
}
我有一个classTypeResponse
因为我有一个回调系统,它为请求的对象返回正确的类类型。
我这样称呼它:
Type type = new TypeToken<HandlerResponse<com.company.model.beans.Model>>(){}.getType();
Calls<com.company.model.beans.Model> calls = new Calls<>(type, com.company.model.beans.Model.class);
calls.doRequest(...);
T
在运行时不存在,Java反射系统无法推断TypeToken
的正确类型。解决方案是创建没有泛型的TypeToken
并将对象传递到您需要的位置。