通用反序列化的Gson类型令牌问题

Ond*_*kar 6 java generics gson

我发现了许多类似的问题,但没有一个有帮助.

这有效:

public class Assets<T> {

public T getAndDeserializeAsset(String endpoint, String assetId, Client client){
    Response response = client.get(endpoint+assetId);
    Gson gson = new Gson();
    T asset = gson.fromJson(response.body, new TypeToken<Email>(){}.getType());
    return asset;
}
Run Code Online (Sandbox Code Playgroud)

}

这不是:

public class Assets<T> {

public T getAndDeserializeAsset(String endpoint, String assetId, Client client){
    Response response = client.get(endpoint+assetId);
    Gson gson = new Gson();
    T asset = gson.fromJson(response.body, new TypeToken<T>(){}.getType());
    return asset;
}
Run Code Online (Sandbox Code Playgroud)

}

我是根据官方文档制作的,所以我不知道它为什么不起作用.

错误:

Exception in thread "main" java.lang.ClassCastException: com.rest.api.Response cannot be cast to model.Email
at main.Main.main(Main.java:34)
Run Code Online (Sandbox Code Playgroud)

dur*_*597 0

唯一有意义的是您的实例Assets<T>必须是 的实例Assets<Response>,而不是 的实例Assets<Email>。您绝对确定您的实例Assets是正确的类型吗?

另外,请记住Gson 不是协变的;当您使用 指定类型时TypeToken,您必须使用您希望反序列化到的确切类型。例如,如果您使用类定义:

class Email extends Response {
Run Code Online (Sandbox Code Playgroud)

然后使用:

new Assets<Response>();
Run Code Online (Sandbox Code Playgroud)

因为 Gson 不是协变的,所以无法知道你真正想要的是一个Email.