意外的 return 类型的 vavr 在反应器中的 Either
Unexpected return type of vavr's Either in reactor
有两种使用 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>>
提供的 return 类型不兼容需要 return 个 reactor.core.publisher.Mono<io.vavr.control.Either<java.lang.String,java.lang.Integer>>
。
恐怕问题只是因为map(Either::right)
的方法只定义了Integer
的Right
类型而没有定义Left
类型,然后return 方法的类型是 Either<?, Integer>
。那么问题是在这种情况下如何获得预期的 return 类型?
[更新]
正如 Hinse 在他的评论中提到的,这个问题与 Java 类型推断的限制有关,我找到了一些针对该问题的链接如下:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=511252
https://e.printstacktrace.blog/java-type-inference-generic-methods-chain-call/
第二个例子似乎 'lose' 应用 map(Either::right)
时左侧的类型信息。
在 map 方法调用中添加一些类型 'hints' 应该可以解决问题。所以 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")));
}
有两种使用 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>>
提供的 return 类型不兼容需要 return 个 reactor.core.publisher.Mono<io.vavr.control.Either<java.lang.String,java.lang.Integer>>
。
恐怕问题只是因为map(Either::right)
的方法只定义了Integer
的Right
类型而没有定义Left
类型,然后return 方法的类型是 Either<?, Integer>
。那么问题是在这种情况下如何获得预期的 return 类型?
[更新]
正如 Hinse 在他的评论中提到的,这个问题与 Java 类型推断的限制有关,我找到了一些针对该问题的链接如下:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=511252
https://e.printstacktrace.blog/java-type-inference-generic-methods-chain-call/
第二个例子似乎 'lose' 应用 map(Either::right)
时左侧的类型信息。
在 map 方法调用中添加一些类型 'hints' 应该可以解决问题。所以 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")));
}