You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建含不同类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:02:26