Java泛型方法类型参数

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.

你能建议我一个通用的解决方案吗?

Tam*_*seh 2

几年后,但我认为这对某人有用。我最终得到了一个更简单的解决方案。这只是一个简单的、被截断的版本,但你可以明白这个想法:

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)