gpt4 book ai didi

java - 返回 Either 时不兼容的类型

转载 作者:行者123 更新时间:2023-11-30 05:31:57 25 4
gpt4 key购买 nike

我正在使用 vavr 的 Either控制我的应用程序的流程,它工作得很好,直到我不必混合几个域......

首先,我得到了一个在域之间共享的接口(interface)。

public interface DomainError {
String getCause();
}

当我只想通知用户并且不需要返回特定对象时,成功也是如此。

@RequiredArgsConstructor
@Getter
public class SuccessMessage {
private final String message;
}

现在,每个域都实现 DomainError像这样

public enum UserError implements DomainError {
USERNAME_ALREADY_EXISTS("Username already exists"),
INVALID_EMAIL("Provided email address is invalid");

private final String cause;
UserError(String cause) {
this.cause = cause;
}
@Override
public String getCause() {
return cause;
}
}

类似于 EmailError里面只是有另一个值。现在,我有EmailFacade

public class EmailFacade {
private final SendEmailUseCase sendEmail;
private final CreateEmailUseCase createEmail;

public Either<DomainError, SuccessMessage> sendUserVerificationEmail(UUID uuid, String receiver) {
return sendEmail.send(createEmail.createUserVerificationEmail(uuid, receiver));
}
}

其中一项服务返回

class SendEmailUseCase {
Either<DomainError, SuccessMessage> send(EmailMessage message) {
if(message == null) return Either.left(EmailError.EMPTY_MESSAGE);
log.info(message.toString());
return Either.right(new SuccessMessage("Email sent"));
}
}

现在,我需要从我的其他域调用它,该域处理用户注册。

为了做到这一点,我编写了这个方法

Either<DomainError, SuccessMessage> register(RegisterUserDto registerUserDto) {
if(userRepository.findUser(registerUserDto.getUsername()).isPresent())
return Either.left(UserError.USERNAME_ALREADY_EXISTS);
Either<DomainError, User> userCreationResult = User.createUser(registerUserDto);
return userCreationResult
.map(user -> {
userRepository.save(user.toDto());
final UUID uuid = verificationTokenRepository.generateVerificationToken(user.getUsername());
return emailFacade.sendUserVerificationEmail(uuid, user.getUsername());
});
}

我在这里做了几件事,但相关部分是最后一个返回语句,以上所有内容都有效。 emailFacade.sendUserVerificationEmail()返回Either<DomainError, SuccessMessage> ,与 register() 相同方法。但由于某种原因,我收到此错误

Error:(28, 17) java: incompatible types: inference variable U has incompatible bounds equality constraints: com.johndoe.myapp.domain.SuccessMessage lower bounds: io.vavr.control.Either<com.johndoe.myapp.domain.DomainError,com.johndoe.myapp.domain.SuccessMessage>

我真的不明白这里出了什么问题......

最佳答案

方法map用于转换容器内的值。在您的情况下,它为您提供了 User 的值,并期望您返回转换后的值。所以万一您要返回Either<DomainError, User>那么结果类型将是 Either<DomainError, Either<DomainError, User>>这不是方法签名期望的返回类型。

如果您不想从函数返回 Either,那么您应该使用 flatMap相反,这会将结果展平为 Either<DomainError, User> :

return userCreationResult
.flatMap(user -> { //replace map with flatMap
userRepository.save(user.toDto());
final UUID uuid = verificationTokenRepository.generateVerificationToken(user.getUsername());
return emailFacade.sendUserVerificationEmail(uuid, user.getUsername());
});

关于java - 返回 Either 时不兼容的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57346674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com