java - 函数 Completable Future 上的 gradle 不兼容错误

标签 java gradle java-8 executorservice completable-future

public void initateScheduledRequest(long time, Runnable actionRequired) {
    LOGGER.info("Retry Request Initated");
    ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
    Executor timeDiff = r -> ses.schedule(() -> executor.execute(r), time, TimeUnit.SECONDS);
    CompletableFuture<Void> future = CompletableFuture.runAsync(actionRequired, executor);
    for (int i = 0; i < 3; i++) {
        future = future
                .handle((k, v) -> v == null ? CompletableFuture.completedFuture(v)
                        : CompletableFuture.runAsync(actionRequired, timeDiff))
                .thenCompose(
                         (Function<? super CompletableFuture<? extends Object>, ? extends CompletionStage<Void>>) Function
                                .identity());
    }
    LOGGER.info("Retry Done");
}

这段代码在 Eclipse 上运行良好,但是当我要使用 gradle 构建时,出现错误:

incompatible types: Function<Object,Object> cannot be converted to Function<? super CompletableFuture<? extends Object>,? extends CompletionStage<Void>>.identity());



如何解决这个问题?

最佳答案

您传递给 handle() 的函数可以返回 CompletableFuture<Throwable>CompletableFuture<Void> .因此唯一兼容的类型是 CompletableFuture<?> .

这意味着 handle() 的结果因此是 CompletableFuture<CompletableFuture<?>> ,您正尝试使用传递给 thenCompose() 的标识函数来解开它.

这意味着 future您尝试将此结果分配给的对象应声明为 CompletableFuture<?> .

一旦你这样做,不幸的是仍然无法使用 identity()对于组合,因为编译器无法推断此调用的正确泛型类型并选择默认值 Object这超出了 Actor 的预期范围,或者是 thenCompose()如果你删除它。

另一方面,如果您尝试使用以下命令强制执行实际类型:

.thenCompose(Function.<CompletableFuture<?>>identity());

那么编译器仍然无法推断类型变量UthenCompose()这也无济于事。

但是,这个问题有一个简单的解决方法:只需使用 lambda 表达式:
.thenCompose(f -> f)

所以得到的代码将是:
CompletableFuture<?> future = CompletableFuture.runAsync(actionRequired, executor);
for (int i = 0; i < 3; i++) {
    future = future
            .handle((k, v) -> v == null ? CompletableFuture.completedFuture(v)
                    : CompletableFuture.runAsync(actionRequired, timeDiff))
            .thenCompose(f -> f);
}

关于java - 函数 Completable Future 上的 gradle 不兼容错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50719121/

相关文章:

java - 提供 tomcat-users.xml 时,Tomcat 镜像不会在 Docker 上启动

java - 如何设置不需要凭据的 Localstack 容器?

java - 在网络服务中使用 gson

android - Gradle 自定义 JavaCompile 任务进行注解处理

elasticsearch - 通过gradle运行弹性后如何停止弹性?

mysql - 如何使用 Java 和 mysql 数据库 "wamp server"进行自动备份 [每天,每周,...]?

java - 无法将内部类转换为 Lambda

java - 如何自动扩展 Heroku Java 后端测功机?

Java 8::(双冒号)运算符的 Groovy 等效项

android - Gradle无法与Google map 同步