我有一个类定义为:

public class Calls<T extends Object>


在此类中,有一个方法doRequest为Gson请求创建一个TypeToken(来自com.google.json.reflect)。

java.lang.reflect.Type type = new TypeToken<HandlerResponse<T>>(){{}}.getType();


其中HandlerResponse是一个简单的模型类,其中包含以下属性:

private Map detail;

private transient T data;

private transient int count = 0;

private String status;


我在Android Studio上得到的例外是:

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)


在TypeToken实例化时崩溃(我当时认为这可能是因为Java的类型擦除而丢失了T类)。

我将Calls的实例创建为:

Calls<com.company.model.beans.Model> calls = new Calls<>(){};

最佳答案

解决后,我将实现修改如下:

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并将对象传递到需要的地方。

10-03 00:12