我对泛型方法的显式类型参数有疑问。我知道我可以这样做:
Foo.<Bar>function();
假设有一个
void <T> function() {...}
Foo 类中的函数。确切的问题是:
我想下载一些内容(Android with Ion)
这些内容都是类似的(Article, BlogArticle, ...),都实现了一个ContentItem接口
目前下载看起来是这样的:
例如新闻
private void downloadNews() {
Ion.with(this)
.load(URL_NEWS)
.as(new TypeToken<List<Article>>(){})
.setCallback(new FutureCallback<List<Article>>() {
@Override
public void onCompleted(Exception e, List<Article> result) {
// do something with result
}
});
}
如果我想下载博客文章,我只需要更改 url 和 Article 类(对于 BlogArticle)。
我试图制作这样的通用函数:
private <T extends ContentItem> void download(String url) {
Ion.with(this)
.load(url)
.as(new TypeToken<List<T>>(){})
.setCallback(new FutureCallback<List<T>>() {
@Override
public void onCompleted(Exception e, List<T> result) {
// do something with result
}
});
}
并调用该函数
this.<Article>download(url);
没关系,编译好了。跑步后我得到
java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 com.my.packagename.model.ContentItem
问题是它没有使用显式类将 Json 映射到 pojo。
你能建议我一个通用的解决方案吗?