如何创建含不同类型Mono的Callable列表并调用对应方法?
问题
我有一个用于处理包含不同类型Mono的Callable列表的方法,请问如何传入Callable<Mono<Integer>>和Callable<Mono<String>>来调用该方法?
我尝试了如下代码:
void mymethod(List<Callable<Mono<?>>> monoList){ } void yourMethod1() { Callable<Mono<Integer>> callableInt = () -> Mono.just(1); Callable<Mono<String>> callableStr = () -> Mono.just("Hello"); List<Callable<Mono<?>>> callableList = Arrays.asList(callableInt,callableStr); mymethod(callableList); }
但编译失败,报错信息为:
no instance(s) of type variable(s) exist so that Callable<Mono<Integer>> conforms to Callable<Mono<?>> inference variable T has incompatible bounds: equality constraints: Callable<Mono<?>> lower bounds: Callable<Mono<Integer>>, Callable<Mono<String>>
请问如何修改mymethod或yourMethod1,才能让这些对象在mymethod中正常使用?
解决方案
方案一:修改mymethod参数类型,兼容嵌套泛型
将方法参数改为List<? extends Callable<? extends Mono<?>>>,通过通配符放宽类型约束,兼容所有Callable<Mono<T>>类型:
void mymethod(List<? extends Callable<? extends Mono<?>>> monoList){ for (Callable<? extends Mono<?>> callable : monoList) { try { Mono<?> mono = callable.call(); // 后续处理逻辑 } catch (Exception e) { // 异常处理 } } } void yourMethod1() { Callable<Mono<Integer>> callableInt = () -> Mono.just(1); Callable<Mono<String>> callableStr = () -> Mono.just("Hello"); // 直接传入列表,无需额外声明中间变量 mymethod(Arrays.asList(callableInt, callableStr)); }
方案二:调用时显式指定泛型类型
如果不想修改mymethod的参数,可以在创建列表时显式指定泛型,帮助编译器完成类型推断:
void mymethod(List<Callable<Mono<?>>> monoList){ // 原有逻辑保持不变 } void yourMethod1() { Callable<Mono<Integer>> callableInt = () -> Mono.just(1); Callable<Mono<String>> callableStr = () -> Mono.just("Hello"); // 显式指定Arrays.asList的泛型为Callable<Mono<?>> List<Callable<Mono<?>>> callableList = Arrays.<Callable<Mono<?>>>asList(callableInt, callableStr); mymethod(callableList); }
原代码编译失败原因
Java泛型是不变的:即使Mono<Integer>是Mono<?>的子类,Callable<Mono<Integer>>也不是Callable<Mono<?>>的子类——因为Callable的泛型参数没有通配符放宽约束,编译器无法识别二者的兼容性。
内容的提问来源于stack exchange,提问作者Pavel Bernshtam
相关产品推荐
相关产品推荐

