![](/img/trans.png)
[英]java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Integer in DAO
[英]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.