如何泛化Reactor函数?

问题描述 投票:0回答:1

我有以下静态函数来在调用另一个通量之前记录一些信息。

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>
java spring-boot project-reactor
1个回答
0
投票

不幸的是,类型推断的深度不会超过 1 层。这意味着当从参数调用

T
时,类型推断会尝试获取
logBefore(r -> log.info("[Enter] myMethod() called."))
的实际类型。这太通用了,无法推断出正确的类型,因此使用了对象。

解决这个问题的两种方法:

  1. 告诉方法泛型类型应该是什么:
return ClassWhereLogBeforeIsDefined.<ServerSentEvent<MyObject>>logBefore(r -> log.info("[Enter] myMethod() called."))
  1. 告诉 lambda 泛型类型应该是什么:
return logBefore((ServerSentEvent<MyObject> r) -> log.info("[Enter] myMethod() called."))
© www.soinside.com 2019 - 2024. All rights reserved.