Java 不兼容类型:lambda表达式X中的错误返回类型无法转换为CompetionStage<;X>;,添加一层后,应用

Java 不兼容类型:lambda表达式X中的错误返回类型无法转换为CompetionStage<;X>;,添加一层后,应用,java,compiler-errors,completable-future,Java,Compiler Errors,Completable Future,我得到以下错误 [ERROR] AccountServiceResource.java:[165,38] incompatible types: bad return type in lambda expression [ERROR] Response<okio.ByteString> cannot be converted to java.util.concurrent.CompletionStage<Response<okio.ByteString>>

我得到以下错误

[ERROR] AccountServiceResource.java:[165,38] incompatible types: bad return type in lambda expression
[ERROR] Response<okio.ByteString> cannot be converted to java.util.concurrent.CompletionStage<Response<okio.ByteString>>
其中,
checkedExceptionCauses
是一个返回
响应的方法

我所做的就是添加另一层
。然后应用()
。但是我有我的内部
。然后应用()
返回原始代码返回的内容,而我的外部
。然后应用()

那么,为什么我现在突然收到关于转换到
完成阶段的投诉?我试过这个只是为了好玩:

return CompletableFuture.completedFuture(checkExceptionCauses(exception));

毫不奇怪,我现在接到上级的投诉,说返回的是
CompletionStage
,而不是
响应

,如果您有同步映射功能,则使用apply

根据报告:

返回一个新的
CompletionStage
,当此阶段完成时 通常,将此阶段的结果作为 提供的功能

另一方面,如果有一个异步映射函数返回一个
可完成的未来
,则使用
thencose
。换句话说,
thencosite
直接返回带有结果的未来,而不是嵌套的未来

发件人:

返回一个新的
CompletionStage
,该阶段使用与相同的值完成 给定函数返回的
CompletionStage
。 当此阶段正常完成时,将使用 此阶段的结果作为参数,返回另一个
完成阶段
。当该阶段正常完成时 此方法返回的
CompletionStage
使用相同的完成 值


因此,尝试将
然后apply
替换为
然后compose

什么是
getAccount()
的返回类型?有效负载(…)
的返回类型是什么?@Andreas-
getAccount()
返回一个
CompletionStage
。对不起,我不认为有必要这么说,因为我没有在编辑之间更改,但我明白为什么它可能是相关的
forPayload
是一个链式方法,仍然返回
响应
对象。@Yahya-是的,但原因:-)我无法找出我的前后…@Yahya-omg。。。我将第一个
然后apply
替换为
然后compose
,它成功了。我将等待发布答案,以防您想为某位代表撰写答案:-)
private Response<ByteString> checkExceptionCauses(Throwable exception) {
     // ...
}
private CompletionStage<Response<ByteString>> getAccountById(RequestContext rc) {
    return accountServiceClient.getAccount().thenApply( getAccountResponse -> {
      AdAccountResponse payload;
      payload.map(getAccountResponse);
      return Response.forPayload(serializePayload(payload));
    }).exceptionally(exception -> {
      LOG.error("Lorem ipsum");
      return checkExceptionCauses(exception);
    });
}
private CompletionStage<Response<ByteString>> getAccountById(RequestContext rc) {
    return accountServiceClient.getAccount().thenApply( getAccountResponse -> {
      AdAccountResponse payload;
      payload.map(getAccountResponse);

      // *** BEGIN CHANGES *** //
      Request salesforceRequest = Request.forUri(FORCEIT_GET_BUSINESS_INFO_URI, "GET").withPayload(businessInfoRequestPayload);
      return httpClient.send(salesforceRequest, rc).thenApply(salesforceResponse -> {
        if (salesforceResponse.payload().isPresent()) {
          // ...
        } else {
          // ...
        }
        AdAccountResponse payload;
        payload.map(getAccountResponse);
        return Response.forPayload(serializePayload(payload));
      });
      // *** END CHANGES *** //

    }).exceptionally(exception -> {
      LOG.error("Lorem ipsum");
      return checkExceptionCauses(exception);
    });
}
return CompletableFuture.completedFuture(checkExceptionCauses(exception));