我对泛型方法的显式类型参数有疑问。我知道我可以这样做:
Foo.<Bar>function();
假设有一个
void <T> function() {...}
在Foo类中起作用。确切的问题是:
我想下载一些内容(带有Ion的Android )
这些内容相似(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。
您能建议我一个通用的解决方案吗?
几年后,但我认为这对某人可能有用。我最终得到了一个更简单的解决方案。它只是一个简单的,被截断的版本,但是您可以了解一下:
public static <T> void asList(Context context, String url, Class<T[]> clazz, final FutureCallback<List<T>> callback) {
Ion.with(context)
.load(url)
.as(clazz)
.setCallback(new FutureCallback<T[]>() {
@Override
public void onCompleted(Exception e, T[] result) {
callback.onCompleted(e, Arrays.asList(result));
}
});
}
并使用像:
asList(context, url, YourObject[].class, new FutureCallback<List<YourObject>>() {...});
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句