Java类型转换异常求助:Integer无法转为Long问题排查
问题原因分析与修复方案
我来帮你揪出这个java.lang.ClassCastException的问题根源,其实就是泛型未明确指定导致的类型不匹配问题。
错误根源拆解
看你代码里的这行定义:
Map<Long, PriorityQueue> map = new HashMap<>();
这里的PriorityQueue没有指定泛型参数,属于原始类型。当你执行map.get(a[i]).add(i);时,i是int类型,会自动装箱成Integer对象存入队列。而后面你尝试用Long pw1 = pq1.remove();接收队列元素时,JVM会尝试把Integer强制转换成Long——这两个是同级的包装类,根本不能直接互相强制转换,自然就触发了类型转换异常。
修复方案(两种可选)
方案一:保持队列存Integer,取的时候转换类型
- 先修正Map的泛型定义,明确队列存储的是Integer类型:
Map<Long, PriorityQueue<Integer>> map = new HashMap<>(); - 从队列取元素时,先以Integer接收,再转成Long(或直接用int,根据业务需求选择):
Integer idx = pq1.remove(); Long pw1 = idx.longValue(); // 如果业务需要Long类型 // 或者直接用int:int pw1 = idx;
方案二:让队列直接存储Long类型
- 修正Map的泛型,指定队列存Long:
Map<Long, PriorityQueue<Long>> map = new HashMap<>(); - 存入队列时,把int类型的
i转成Long:map.get(a[i]).add((long)i);
这样后续用Long pw1 = pq1.remove();接收就不会有类型问题了。
额外提示
Java泛型是编译期检查机制,使用原始类型(不指定泛型参数)会绕过编译期类型校验,很容易在运行时触发这类类型转换错误。所以在集合类定义时,一定要明确指定泛型参数,提前规避这类问题。
内容的提问来源于stack exchange,提问作者Prasad Chaudhari
相关产品推荐
相关产品推荐

