You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,取的时候转换类型

  1. 先修正Map的泛型定义,明确队列存储的是Integer类型:
    Map<Long, PriorityQueue<Integer>> map = new HashMap<>();
    
  2. 从队列取元素时,先以Integer接收,再转成Long(或直接用int,根据业务需求选择):
    Integer idx = pq1.remove();
    Long pw1 = idx.longValue(); // 如果业务需要Long类型
    // 或者直接用int:int pw1 = idx;
    

方案二:让队列直接存储Long类型

  1. 修正Map的泛型,指定队列存Long:
    Map<Long, PriorityQueue<Long>> map = new HashMap<>();
    
  2. 存入队列时,把int类型的i转成Long:
    map.get(a[i]).add((long)i);
    

这样后续用Long pw1 = pq1.remove();接收就不会有类型问题了。

额外提示

Java泛型是编译期检查机制,使用原始类型(不指定泛型参数)会绕过编译期类型校验,很容易在运行时触发这类类型转换错误。所以在集合类定义时,一定要明确指定泛型参数,提前规避这类问题。

内容的提问来源于stack exchange,提问作者Prasad Chaudhari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:44:34