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

调用com.google.common.collect.Lists.cartesianProduct()报NoSuchMethodError的排查

调用Guava的Lists.cartesianProduct方法时持续出现NoSuchMethodError的问题

我尝试调用com.google.common.collect.Lists.cartesianProduct(...),但一直报NoSuchMethodError。不管是接受List of Lists作为参数的版本,还是接受List数组作为参数的版本,只要能正常运行就行。请问我哪里操作错了?


尝试1:

import java.util.List;
import com.google.common.collect.Lists;
...
List<List<MyClass>> candidates = new ArrayList<>();
... //填充List of Lists
List<List<MyClass>> product = Lists.cartesianProduct(candidates);

结果:java.lang.NoSuchMethodError: 'java.util.List com.google.common.collect.Lists.cartesianProduct(java.util.List)'
调试器评估结果:Type does not implement selector cartesianProduct and signature (Ljava/util/List;)Ljava/util/List;

尝试2:

List<List<MyClass>> candidates = new ArrayList<>();
... //填充List of Lists
List<MyClass>[] candidatesArray = candidates.toArray(new List[0]);
List<List<MyClass>> product = Lists.cartesianProduct(candidates);

结果:java.lang.NoSuchMethodError: 'java.util.List com.google.common.collect.Lists.cartesianProduct(java.util.List[])'
调试器评估结果:Type does not implement selector cartesianProduct and signature ([Ljava/util/List;)Ljava/util/List;

尝试3:

List<List<MyClass>> candidates = new ArrayList<>();
... //填充List of Lists
List<List<MyClass>> product = Lists.cartesianProduct(candidates.get(0), candidates.get(1));

结果:java.lang.NoSuchMethodError: 'java.util.List com.google.common.collect.Lists.cartesianProduct(java.util.List[])'
调试器评估结果:Type does not implement selector cartesianProduct and signature ([Ljava/util/List;)Ljava/util/List;


问题原因

NoSuchMethodError本质是编译时依赖的Guava版本和运行时使用的版本不一致,或者当前使用的Guava版本太老,没有你调用的方法签名:

  1. Lists.cartesianProduct(List<List<?>>) 这个接受List of Lists的方法是Guava 19.0版本才新增的;
  2. 接受可变参数(如Lists.cartesianProduct(List<?>, List<?>))的版本虽然在更早版本就存在,但如果运行时的Guava版本过低,也会出现方法找不到的情况;
  3. 泛型数组的类型擦除问题也可能导致签名不匹配,但核心还是版本不一致。

解决方案

  1. 统一Guava版本:确保项目编译和运行时使用同一个足够新的Guava版本(至少19.0及以上,推荐用最新稳定版)。
    • Maven示例(在pom.xml中添加):
      <dependency>
          <groupId>com.google.guava</groupId>
          <artifactId>guava</artifactId>
          <version>32.1.3-jre</version> <!-- 替换为最新稳定版 -->
      </dependency>
      
    • Gradle示例(在build.gradle中添加):
      implementation 'com.google.guava:guava:32.1.3-jre'
      
  2. 排查依赖冲突:检查项目依赖树,排除其他依赖间接引入的旧版Guava,确保只有指定的新版本生效。
  3. 正确调用方法:
    • 如果用的是Guava 19.0+,直接用Lists.cartesianProduct(candidates)(List of Lists参数)即可;
    • 如果用的是更老的版本,改用可变参数形式:Lists.cartesianProduct(candidates.get(0), candidates.get(1), ...),或者把List转成List<?>[]数组后传入,但要注意泛型类型匹配。

内容的提问来源于stack exchange,提问作者Joe7

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:44:55