如何使用Mono.zip处理泛型Response并行调用并获取实际响应?
解决Mono.zip返回Object[]无法调用Response接口方法的问题
核心原因
Mono.zip返回的Object[]中每个元素本质都是Response接口的实现类,只是Java泛型擦除导致编译时类型信息丢失,所以编译器无法识别其实际类型。
解决方案
由于所有请求返回的Mono都声明为? extends Response,可以安全地将Object[]中的元素强制转换为Response接口,之后就能正常调用responseMethod()。
基础实现代码
var requests = x.preRequests() .getSteps() .stream() .map(Supplier::get) .toList(); return Mono.zip(requests, objects -> Arrays.stream(objects) // 强制转换为Response接口 .map(obj -> (Response) obj) .map(Response::responseMethod) // 根据业务需求收集结果,示例为List .collect(Collectors.toList()) );
带类型校验的安全实现
如果需要避免潜在的类型转换异常,可以先通过instanceof做类型校验:
return Mono.zip(requests, objects -> Arrays.stream(objects) .map(obj -> { if (obj instanceof Response response) { return response.responseMethod(); } // 处理非预期类型的情况,比如抛出异常或返回默认值 throw new IllegalArgumentException("Unexpected response type: " + obj.getClass().getName()); }) .collect(Collectors.toList()) );
说明
因为上游的Supplier<Mono<? extends Response>>已经保证了所有响应都实现了Response接口,所以强制转换是类型安全的,泛型擦除仅影响编译时的类型推断,运行时对象的实际类型依然符合预期。
内容的提问来源于stack exchange,提问作者vandaele mathias
相关产品推荐
相关产品推荐

