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)
唯一有意义的是您的实例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
.