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

时间:2016-10-31 14:14:10

标签: java arrays exception arraylist foreach

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捕获数组中的每个元素,然后在递归调用中处理它们。

@Alex Shesterov和其他人,    这是生成 adj 的代码。

    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));

3 个答案:

答案 0 :(得分:0)

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

方法调用不正确

topologicalSortUtil(1,booleanArray,passingIntegerInsteadOfList,stack)

<强> ImplementedMethod

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

答案 1 :(得分:0)

该异常表明,adj数组(应该包含ArrayList<Integer>的实例)实际上包含ArrayList,其中java.util.Arrays$ArrayList为元素。

因此,增强型循环在遇到ClassCastException的此类元素时会遇到ArrayList,并尝试将其“解释”为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] : ...
  ...

另一个注意事项:you should never use raw generic types - 使用显式泛型参数会对上面的代码产生编译时错误,并且该问题很容易找到并修复。

答案 2 :(得分:0)

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

SELECT master_tbl.col3,master_tbl.col2
SUBSTRING_INDEX(SUBSTRING_INDEX(master_tbl.col2, ',', numbers.n), ',', -1)       
col1 FROM
(SELECT 1 n UNION ALL
SELECT 2 UNION ALL SELECT 3 UNION ALL
SELECT 4 UNION ALL SELECT 5) numbers INNER JOIN master_tbl
ON CHAR_LENGTH(master_bl.col1)
-CHAR_LENGTH(REPLACE(master_tbl.col1, ',', ''))>=numbers.n-1
ORDER BY col3, n;

如果没有某种类型声明,就不应该使用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而不是addaddAll方法将它接收的集合中的所有元素添加到调用它的集合中。

addAll

最好不要混合使用数组和列表,而是传递列表列表并为其指定合适的类型。

尽量避免使用原始类型并从代码中删除所有原始类型或不安全类型警告(而不是arr[1].addAll(Arrays.asList(8,6,2)); !),除非您开始编写通用集合的库并且您知道自己在做什么。