我有以下静态函数来在调用另一个通量之前记录一些信息。
public static Flux<ServerSentEvent<MyObject>> logBefore(Consumer<ServerSentEvent<MyObject>> consumer) {
return Flux.<ServerSentEvent<MyObject>>empty()
.doOnEach(logOnComplete(consumer));
}
我调用该函数如下:
public Flux<ServerSentEvent<MyObject>> myMethod(@Valid @RequestBody MyRequest request) {
return logBefore(r -> log.info("[Enter] myMethod() called."))
.switchIfEmpty(client.retrieveData(request));
}
如何泛化这个函数?我尝试过如下:
public static <T> Flux<T> logBefore(Consumer<T> consumer) {
return Flux.<T>empty()
.doOnEach(logOnComplete(consumer));
}
然而,编译器正在抱怨。
Required type:Flux<ServerSentEvent<MyObject>>
Provided:Flux<Object>
不幸的是,类型推断的深度不会超过 1 层。这意味着当从参数调用
T
时,类型推断会尝试获取 logBefore(r -> log.info("[Enter] myMethod() called."))
的实际类型。这太通用了,无法推断出正确的类型,因此使用了对象。
解决这个问题的两种方法:
return ClassWhereLogBeforeIsDefined.<ServerSentEvent<MyObject>>logBefore(r -> log.info("[Enter] myMethod() called."))
return logBefore((ServerSentEvent<MyObject> r) -> log.info("[Enter] myMethod() called."))