gpt4 book ai didi

Java泛型方法类型参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:01:53 25 4
gpt4 key购买 nike

我对泛型方法的显式类型参数有疑问。我知道我可以做到这一点:

Foo.<Bar>function();

假设有一个

void <T> function() {...}

Foo 类中的函数。确切的问题是:

  • 我想下载一些内容(安卓 Ion )

  • 这些内容类似(Article, BlogArticle, ...),都实现了一个ContentItem接口(interface)

  • 目前下载是这样的:

例如新闻

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 和文章类(对于 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 cannot be cast to 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>>() {...});

关于Java泛型方法类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24507248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com