繁体   English   中英

java.lang.ClassCastException:java.util.Arrays $ ArrayList无法强制转换为java.lang.Integer

[英]java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Integer

void topologicalSortUtil(int v, boolean visited[], Stack<Integer> stack, ArrayList<Integer>[] adj) {
        visited[v] = true;
        for (int i : adj[v]) {
            if (!visited[i]) {
                topologicalSortUtil(i, visited, stack, adj);
            }
        }

        stack.push(v);
    }

在这里,我正在呼唤一系列的arraylist。 正如我的IDE(IntelliJ)所说,错误在增强的for循环中。 它似乎是一个完全有效的调用,因为adj [v]将返回一个ArrayList和整数i捕获数组中的每个元素,然后在递归调用中处理它们。

was generated. @Alex Shesterov和其他人,这是使用生成的代码。

    ArrayList[] arr = new ArrayList[n+1];
        for(int i=0; i<=n; i++){
            arr[i] = new ArrayList<Integer>();
        }
        arr[1].add(Arrays.asList(8,6,2));
        arr[2].add(Arrays.asList(7));
        arr[3].add(Arrays.asList(6));
        arr[4].add(Arrays.asList(5,2));
        arr[5].add(Arrays.asList(4,2,3));
        arr[6].add(Arrays.asList(3,2,5));
        arr[7].add(Arrays.asList(2));
        arr[7].add(Arrays.asList(1,2,4));

错误在方法调用中。可能是第一次调用topologicalSortUtil时。 您传递整数而不是整数列表

方法调用不正确

topologicalSortUtil(1,booleanArray,passingIntegerInsteadOfList,stack)

ImplementedMethod

void topologicalSortUtil(int v, boolean visited[], Stack<Integer> stack, 
    }

例外情况表明, adj阵列应该包含ArrayList<Integer>实例,实际上包含一个ArrayList ,它有一个java.util.Arrays$ArrayList作为元素。

因此,增强型循环在遇到ArrayList这样一个元素时会遇到ClassCastException ,并尝试将其“解释”为Integer

请检查和/或发布构建 adj数组的代码。

另外,请在代码中查找“类型安全”“原始类型”警告 - 您可能已经不安全地忽略了导致此异常的其中一些警告。


更新:

正如预期的那样,问题是您要将列表添加为列表的 元素 ,这些列表是adj / arr数组的元素。 例如以下几行:

ArrayList[] arr = new ArrayList[n+1];
arr[1] = new ArrayList<Integer>();
arr[1].add(Arrays.asList(8,6,2));

会导致以下结构:

arr - array
  [0] : ...
  [1] : ArrayList (of lists) :
          [0] : List (of integers) : 
                  [0] : 8
                  [1] : 6
                  [2] : 2
  [2] : ...
  ...

List.add()将单个元素添加到列表中。

你需要的是List.addAll()方法,它将集合中的所有元素 (而不是集合本身)添加到列表中:

arr[1].addAll(Arrays.asList(8,6,2));

这会产生以下结构:

arr - array
  [0] : ...
  [1] : ArrayList (of integers) :
          [0] : 8
          [1] : 6
          [2] : 2
  [2] : ...
  ...

另一个注意事项: 你永远不应该使用原始泛型类型 - 使用显式泛型参数会为上面的代码产生编译时错误,并且问题很容易找到并修复。

生成数组的代码不正确且类型不安全。 您可能从编译器收到有关“不安全类型”或“原始类型”的警告。 以下是原始类型的用法:

ArrayList[] arr = new ArrayList[n+1];

如果没有某种类型的声明,就不应该使用ArrayList类型。

然后,将arr每个元素初始化为ArrayList<Integer> 但由于这是分配给原始类型数组元素,编译器不知道该元素是一个ArrayList<Integer> ,并且不会警告您下一步,这是不好的一步:

arr[1].add(Arrays.asList(8,6,2));

您在arr[1]的列表中添加了一个元素。 add方法增加了一个单独的元件,其是传递给它的对象。 那个对象是什么? 它是一个List ,由Arrays.asList(...)

因此,您没有ArrayList<Integer>而是拥有一个具有单个元素的原始ArrayList ,并且该元素是一个整数列表 当然,这不能归结为Integer

应该使用addAll而不是使用add addAll方法将它接收的集合中的所有元素添加到调用它的集合中。

arr[1].addAll(Arrays.asList(8,6,2));

最好不要混合数组和列表,而是传递列表列表并为其提供适当的类型。

尝试避免原始类型并从代码中消除所有原始类型或不安全类型警告(而不是@SupressWarnings !),除非您开始编写通用集合的库并且您知道自己在做什么。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM