【问题标题】:java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Integerjava.lang.ClassCastException:java.util.Arrays$ArrayList 无法转换为 java.lang.Integer
【发布时间】:2017-03-13 15:24:20
【问题描述】:
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));

【问题讨论】:

  • adj 是 ArrayList&lt;Integer&gt; 类型的数组,在你的 foreach 循环中 int i 不能保存数组列表
  • 您确定错误在该代码中吗?它似乎在您使用 Arrays 类的地方。

标签: java arrays exception arraylist foreach


【解决方案1】:

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

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

你不应该在没有某种类型声明的情况下使用类型ArrayList

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

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

您将一个元素添加到arr[1] 中的列表。 add 方法添加了一个 single 元素,这是传递给它的对象。那个物体是什么?这是一个List,由Arrays.asList(...)制作。

所以你有一个原始的ArrayList,而不是一个ArrayList&lt;Integer&gt;,它有一个元素,那个元素是一个整数的列表。当然,这不能转换为Integer

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

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

最好不要混合数组和列表,而是传递一个列表列表并给它适当的类型。

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

【讨论】:

  • 非常详细的答案。在您回答之前我使用了 addAll 并且它有效。但并不真正知道“为什么”。非常感谢!
【解决方案2】:

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

方法调用不正确

topologicalSortUtil(1,booleanArray,passingIntegerInsteadOfList,stack)

实施方法

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

【讨论】:

  • 这有点神秘。该方法是递归的,它调用自身。它的参数是intboolean []Stack&lt;Integer&gt;ArrayList&lt;Integer&gt;[],这些也是调用中的参数。所以不确定你在这里想说什么。
  • @RealSkeptic 我理解topologicalSortUtil 是递归的。但看起来错误出现在第一次调用topologicalSortUtil 的代码中。例如topologicalSortUtil 第一次调用可能来自 main 方法,然后它将是递归的
  • 如果是这种情况,我会重写答案。目前尚不清楚您在哪里推断出用户实际上正在调用“不正确的方法调用”,而“实现的方法”甚至在语法上都不正确。只是解释,不要添加不存在的代码。
  • It's not clear where you deduced that the user is actually .. 在我看来这是基于发布代码的唯一可能性
  • 其实看看 Alex Shesterov 的回答。这更有意义。此外,如果用户尝试使用整数而不是列表调用方法,他会得到编译错误,而不是运行时异常。请仔细阅读您的两段代码。你真的相信它们有意义吗?
【解决方案3】:

异常表明应该包含ArrayList&lt;Integer&gt; 实例的adj 数组实际上包含一个ArrayList,它有一个java.util.Arrays$ArrayList 作为元素。

因此,增强的循环在遇到ArrayList 的此类元素并尝试将其“解释”为Integer 时会遇到ClassCastException

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

另外,请在您的代码中查找 “类型安全”“原始类型” 警告 - 您可能不安全地忽略了其中的几个导致此问题例外。


更新:

正如预期的那样,问题在于您将 lists 添加为列表的 elements,这些列表是 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 — 使用显式泛型参数会为您的上述代码产生编译时错误,并且该问题很容易找到并修复。

【讨论】:

  • 请查看我现在粘贴的代码。这部分生成adj。
猜你喜欢
  • 2020-06-17
  • 1970-01-01
  • 2015-12-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
相关资源
最近更新 更多