Gson非法类型变量引用

时间:2017-01-09 18:38:40

标签: java android generics gson type-erasure

我有一个定义为:

的类
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

1 个答案:

答案 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并将对象传递到您需要的位置。

相关问题