java – 没有类型变量的实例U存在,以便Foo符合CompletionStage
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 没有类型变量的实例U存在,以便Foo符合CompletionStage,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3016字,纯文字阅读大概需要5分钟。
内容图文
我已经在这几个小时,但似乎无法解开这个.该错误与此段代码有关:
(这个问题底部的完整代码.我正在使用屏幕截图直观地显示问题.)
错误本身是:
no instance(s) of type variable(s) U exist so that GetUsersForAdAccountResponse conforms to CompletionStage
在thenComposes的链的最开始,我删除了返回并使用IntelliJ的“引入局部变量…”功能来查看整个链(直到并包括第1118行)返回的类型:
结果是
final CompletionStage<U> uCompletionStage = ...
但是你可以看到包含方法的返回类型是
public CompletionStage<GetUsersForAdAccountResponse> ...
什么阻止编译器推断GetUsersForAdAccountResponse? (同样,通常这里有回报.)
我也试过在每个thenCompose中引入一个局部变量,它们看起来都是正确的.每个产生一个CompletionStage< Foo>,其下一个thenCompose提供一个期望Foo的lambda并产生一个CompletionStage< Bar>,依此类推. (在代码的一次重组中,我确实看到了嵌套的CompletionStage< CompletionStage< Foo>>但我认为这是我自己重写的工件.)
我不知道它是否会有所帮助,但这是整个方法:
@Override
public CompletionStage<GetUsersForAdAccountResponse> getUsersForAdAccount(
RequestContext context, GetUsersForAdAccountRequest request) {
Uuid adAccountId = request.getAdAccountId();
return verifyAuthorization(context,
PortcullisTemplates.Action.GET_USERS_FOR_AD_ACCOUNT.getName(),
portcullisTemplates.topOrganizationResource())
.thenCompose(auditLogPrincipal -> jdbiExecutor.executeInTransaction(handler -> {
// We purposely safeguard the account lookup as well behind Portcullis.
AdAccountDao adAccountDao = handler.attach(AdAccountDao.class);
if (adAccountDao.getAdAccountById(adAccountId) == null) {
throw new ValidationException(SERVICE_NAME,
"Ad account not found: " + UuidUtils.toString(adAccountId));
}
AdAccountRoleUserMappingDao roleDao = handler.attach(AdAccountRoleUserMappingDao.class);
List<String> roleNames = request.getRoleNamesList();
return roleNames.isEmpty() ?
roleDao.getAdAccountRoleUserMappingsByAdAccount(adAccountId) :
roleDao.getAdAccountRoleUserMappingsByAdAccountAndRoles(adAccountId, roleNames);
})).thenCompose(adAccountRoleUserMappings -> jdbiExecutor.execute(UserDao.class, userDao -> {
return userDao
.getUsersBy]UserIds(
adAccountRoleUserMappings.stream()
.map(AdAccountRoleUserMapping::userId)
.collect(Collectors.toList())
).stream()
.collect(Collectors.toMap(
User::userId,
user -> new EncryptedFieldsBuilder()
.firstName(user.encryptedFirstName())
.lastName(user.encryptedLastName())
.email(user.encryptedEmail())
.build()
));
}).thenCompose(
userEncryptedFields -> padlockService.decryptUserAccounts(userEncryptedFields)
).thenCompose(decryptedUsers -> GetUsersForAdAccountResponse.newBuilder()
.addAllUserWithRole(
adAccountRoleUserMappings.stream()
.filter(mapping -> decryptedUsers.containsKey(mapping.userId()))
.map(mapping -> UserWithRole.newBuilder()
.setAccount(decryptedUsers.get(mapping.userId()))
.setRoleName(mapping.roleName())
.build())
.collect(Collectors.toSet())
).build()
));
}
解决方法:
链中的最后一个thenCompose应该是thenApply.传递给它的函数返回一个GetUsersForAdAccountResponse,它不是CompletionStage.
thenCompose是CompletableFuture的flatMap.它需要一个返回CompletionStage并使结果变平的函数.
内容总结
以上是互联网集市为您收集整理的java – 没有类型变量的实例U存在,以便Foo符合CompletionStage全部内容,希望文章能够帮你解决java – 没有类型变量的实例U存在,以便Foo符合CompletionStage所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。