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

Java全排列代码报ClassCastException如何排查修复

异常根本原因

抛出ClassCastException的核心问题出在List<Integer> n = new ArrayList(Arrays.asList(nums));这行:

  • Arrays.asList()方法做泛型适配时,如果传入的是基本类型数组(比如这里的int[] nums),不会遍历数组把每个int值转为Integer存入列表,而是会把整个int数组对象作为单个元素存入列表,最终得到的实际是List<int[]>类型,和你声明的List<Integer>类型不匹配。
  • 错误信息里的[I是JVM中int数组类型的类标识,你在第20行调用nums.get(i)取到的实际是int数组对象,强行转成Integer自然会抛出类型转换异常。
原有逻辑的额外缺陷

除了类型转换错误,递归逻辑还有关键遗漏:

  • 你在循环中取出了当前位置的元素c,但从来没有把这个元素加入当前路径temp中,就算类型问题修复,最终返回的结果也会全是空列表,得不到正确的全排列。
修复后可运行代码
List<List<Integer>> res;

public List<List<Integer>> permute(int[] nums) {
    res = new ArrayList<>();
    // 手动遍历int数组转List<Integer>,避开Arrays.asList处理基本类型数组的坑
    List<Integer> n = new ArrayList<>();
    for (int num : nums) {
        n.add(num);
    }
    permute(n, new ArrayList<>());
    return res;
}

private void permute(List<Integer> nums, List<Integer> cur) {
    if (nums.size() == 0) {
        res.add(cur);
        return;
    }
    
    for (int i = 0; i < nums.size(); ++i) {
        List<Integer> temp = new ArrayList<>(cur);
        List<Integer> temp2 = new ArrayList<>(nums);
        Integer c = nums.get(i);
        // 把选中的当前元素加入排列路径
        temp.add(c);
        temp2.remove(i);
        
        permute(temp2, temp);
    }
}
补充说明
  • 如果使用Java 8及以上版本,int数组转List<Integer>可以用流式写法简化:List<Integer> n = Arrays.stream(nums).boxed().collect(Collectors.toList());
  • 原递归思路本身是正确的:每次从未选元素中挑一个加入当前路径,移除该元素后递归处理剩余元素,直到未选元素为空就把当前路径存入结果集。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 10:33:10