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));