java - Gson非法类型变量引用

标签 java android generics gson type-erasure

我有一个类定义为:

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

关于java - Gson非法类型变量引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41554706/

相关文章:

ios - 'type' 不是 'T' 的成员类型

c# - 什么是 "Dispatcher"设计模式?

Java 方法链接 可选地基于参数

java - 是否可以使未展开的 Accordion Pane 点击通过?

Android - 手机锁定时执行操作

Android:用户评论实现

java - "java.lang.ClassCastException: org.apache.derby.client.net.NetConnection cannot be cast to smartdatabase.Connection"有人知道为什么吗?

java - 安卓安装问题

使用 Proguard DX SimException 本地 0000 : invalid 构建 Android

java - 为什么是<T extends Comparable>而不是<T Implements Comparable>?