如何创建兼容多类型的泛型CompletableFuture列表并按需添加任务
解决CompletableFuture泛型列表的类型错误问题
核心问题分析
当前代码的类型错误源于列表泛型定义过窄:List<CompletableFuture<List<Object>>>无法兼容CompletableFuture<List<Test>>、CompletableFuture<List<TestNumber>>这类子类型实例。同时需要优化任务添加逻辑,仅在开关为true时创建并加入对应异步任务,避免执行不必要的操作。
修正后的代码
// 定义兼容所有CompletableFuture类型的列表 List<CompletableFuture<?>> futureList = new ArrayList<>(); // 基础任务:始终执行 CompletableFuture<List<Test>> dbTestFuture = CompletableFuture.supplyAsync(() -> testDao.findTestDetails("abc") ); futureList.add(dbTestFuture); // 仅当开关开启时,添加对应任务 if (provideTestNumbers) { CompletableFuture<List<TestNumber>> dbTestNumberFuture = CompletableFuture.supplyAsync(() -> testDao.findTestNumbers("abc") ); futureList.add(dbTestNumberFuture); } if (provideTestAuthor) { // 修正DAO方法名与变量引用错误 CompletableFuture<List<TestAuthor>> dbAuthorFuture = CompletableFuture.supplyAsync(() -> testDao.findTestAuthor("abc") ); futureList.add(dbAuthorFuture); } // 等待所有任务完成 CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0])).join();
关键优化点
- 泛型调整:使用
List<CompletableFuture<?>>作为列表类型,CompletableFuture.allOf()仅需要CompletableFuture实例本身,不关心其泛型参数,因此该类型可以容纳所有异步任务。 - 修复代码错误:移除了重复的变量声明,修正了
provideTestAuthor分支中DAO方法名和变量引用的错误。 - 按需执行任务:通过条件判断,仅在对应开关为
true时才创建并添加任务,避免无意义的异步任务执行。
后续结果获取(可选)
如果需要获取每个任务的执行结果,可以遍历列表并通过join()方法获取,注意类型转换的安全性:
for (CompletableFuture<?> future : futureList) { Object result = future.join(); if (result instanceof List<?>) { List<?> listResult = (List<?>) result; // 根据实际类型做后续处理,例如判断是否为List<Test>等 } }
内容的提问来源于stack exchange,提问作者raksha c
相关产品推荐
相关产品推荐

