java—React堆中vavr的意外返回类型

laawzig2  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(327)

使用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

kx7yvsdv

kx7yvsdv1#

第二个示例似乎在 map(Either::right) 已应用。
向map方法调用添加一些类型的“提示”就可以了。所以testreactor将如下所示:

public Mono<Either<String, Integer>> testReactorEither(int s) {
    return Mono.just(s)
            .filter(x -> x == 0)
            .<Either<String, Integer>>map(Either::right)
            .switchIfEmpty(Mono.just(Either.left("ERROR")));
}

相关问题