使用vavr有两种简单的方法。
public Either<String, Integer> testEither(int s) {
if (s == 0)
return Either.left("Wrong");
return Either.right(s);
}
public Mono<Either<String, Integer>> testReactorEither(int s) {
return Mono.just(s).filter(x -> x == 0).map(Either::right)
.switchIfEmpty(Mono.just(Either.left("ERROR")));
}
这个 testEither
正常工作,但同时 testReactorEither
引发“不兼容类型”的编译错误,表示提供的 reactor.core.publisher.Mono<io.vavr.control.Either<java.lang.Object,java.lang.Integer>>
与要求的 reactor.core.publisher.Mono<io.vavr.control.Either<java.lang.String,java.lang.Integer>>
.
恐怕问题只是因为 map(Either::right)
只是定义了 Right
类型 Integer
但不是这样 Left
类型,然后方法的返回类型为 Either<?, Integer>
. 那么问题是,在这种情况下,我如何获得预期的回报类型?
[更新]
正如hinse在评论中提到的,这个问题与java类型推断的局限性有关,我找到的一些关于这个问题的链接如下:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=511252
https://e.printstacktrace.blog/java-type-inference-generic-methods-chain-call/
https://openjdk.java.net/jeps/101
1条答案
按热度按时间kx7yvsdv1#
第二个示例似乎在
map(Either::right)
已应用。向map方法调用添加一些类型的“提示”就可以了。所以testreactor将如下所示: