问题描述
我想创建一个辅助方法,该方法可以将任何同步方法调用包装/转换为异步Mono
。
required type: Mono <T>
Provided: Mono<? extends Callable<? extends T>>
这是我的代码:
public <T> Mono<T> wrapAsync(Callable<? extends T> supplier) {
return Mono.fromCallable(() -> supplier)
.subscribeOn(Schedulers.boundedElastic());
}
public void run() {
Mono<Boolean> mono = wrapAsync(() -> syncmethod());
}
private Boolean mySyncmethod() {
return true; //for testing only
}
解决方法
首先,您使用Callable Mono.fromCallable(supplier)
。
然后您将遇到一个问题,因为Mono.fromCallable将被推断为Callable<? extend ? extend T>
,因此您的Mono将是Mono<? extend T>
而不是Mono<T>
。为避免这种情况,有两种解决方案:
- 更改wrapAsync的签名:
public <T> Mono<T> wrapAsync(Callable<T> supplier) {
return Mono.fromCallable(supplier)
.subscribeOn(Schedulers.boundedElastic());
}
- 或者如果您想保留签名,则需要提供类型:
public <T> Mono<T> wrapAsync(Callable<? extends T> supplier) {
return Mono.<T>fromCallable(supplier)
.subscribeOn(Schedulers.boundedElastic());
}