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.
| 归档时间: |
|
| 查看次数: |
440 次 |
| 最近记录: |