如何为任何方法调用创建通用包装器?
How to create a generic wrapper for just any method call?
我想创建一个辅助方法,可以 wrap/convert 只需 任何 同步方法调用异步 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());
}
我想创建一个辅助方法,可以 wrap/convert 只需 任何 同步方法调用异步 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
}
首先你用 CallableMono.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());
}