微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反应堆中Vavr的Either的意外返回类型

如何解决反应堆中Vavr的Either的意外返回类型

有两种使用vavr的Either的简单方法

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>>返回类型与{{ 1}}。

恐怕问题只是因为reactor.core.publisher.Mono<io.vavr.control.Either<java.lang.String,java.lang.Integer>>方法只定义了map(Either::right)的{​​{1}}类型,却没有定义Right类型,然后返回方法的类型为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

解决方法

第二个示例似乎在应用map(Either::right)时“丢失”了左侧的类型信息。

在map方法调用中添加一些类型的“提示”应该可以解决问题。因此,testReactorEither将如下所示:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。