Tam*_*seh 8 java generics android android-ion
我对泛型方法的显式类型参数有问题.我知道我可以这样做:
Foo.<Bar>function();
Run Code Online (Sandbox Code Playgroud)
假设有一个
void <T> function() {...}
Run Code Online (Sandbox Code Playgroud)
在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
}
});
}
Run Code Online (Sandbox Code Playgroud)
如果我想下载博客文章,我必须更改网址和文章类(对于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
}
});
}
Run Code Online (Sandbox Code Playgroud)
并调用该函数
this.<Article>download(url);
Run Code Online (Sandbox Code Playgroud)
没关系,编译得很好.跑完后我得到了
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));
}
});
}
Run Code Online (Sandbox Code Playgroud)
并使用如下:
asList(context, url, YourObject[].class, new FutureCallback<List<YourObject>>() {...});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2320 次 |
| 最近记录: |