Java - 通用泛型函数参数

标签 java

因此,我正在尝试整合通用功能并将其添加到我的流程中,以减少重复代码。我想要这样的东西:

private <T> void cacheOrCall(T in) {
    // just want to execute any function passed here
    // in.execute? don't know how to fire these
}

样板要大得多,这就是为什么我想集中它,但我希望我的函数调用看起来像:

cacheOrCall(mApi.getAlerts(mContext));
cacheOrCall(mApi.getSummary(mContext));
cacheOrCall(mApi.getHeadlines(mContext));

所以我的问题是我是否正确处理了这个通用函数参数?我如何执行作为参数传递的通用函数?

提前谢谢你

编辑:抱歉,“in”函数是一个异步 API 调用。我系统中的回调是一个事件总线,所以我不关心这个函数监听任何东西。我只是想让它触发我给它的 api 调用。但是,这可以是各种不同的 api 调用。我希望这个函数接受我给它的任何 api 调用函数并触发它。希望这更有意义

最佳答案

如果我理解正确的话,您想传递一个只在必要时调用的函数。一种方法是接受一个 Runnable:

private void cacheOrCall(Runnable in, ApiCommand command, String cacheKey) {
  //...
  in.run();
  //...
}

在 Java 8+ 中,您可以使用 lambda 调用该方法:

cacheOrCall(() -> mApi.getData(mContext), myCommand, myCacheKey);

在 Java 7 中,您可以传递一个匿名类:

Runnable in = new Runnable() { public void run() {
                                  mApi.getData(mContext);
                               }
                             };

cacheOrCall(in, myCommand, myCacheKey);

如果需要返回值,可以使用Callable<T>而不是 Runnable :

private <T> void cacheOrCall(Callable<T> in, ApiCommand command, String cacheKey) {
  //...
  T result = in.call();
  //...
}

关于Java - 通用泛型函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29239978/

相关文章:

java - 如何确定由 Executor.execute() (不是 ExecutorService )启动的线程/任务是否完成?

java - 启用 Spring Security 4 的 Spring MVC

java - 如何使用泛型函数解析 json?

java - 太多未使用的阻塞线程的后果

java - log4j 警告问题 - apache commons

java - 微调器选择是更新微调器项目之前的记录

java - 如何在 JVM 中查看 MaxPermSize?

java - byte-buddy 可以用作非反射方式来收集 [field]/[method return] 值作为集合或映射吗?

java - 编写一个程序来打印每个字母以及用户输入中出现的数量

java - 我如何从无线和网络列表中删除 "Bluetooth "(Android Gingerbread)