报错:java.lang.Integer cannot be cast to java.lang.Long

本文介绍了一种在使用MyBatis框架时遇到的数据类型转换错误,并给出了具体的解决方案。通过调整查询结果的存储类型并进行适当的类型转换,成功解决了Java与数据库间的数据类型不匹配问题。

笔者在项目中写了一个查询方法,从数据库中查询一组数据,代码如下:

List<Map<String,Integer>> levelList = ceoLevelMapper.selectDownGradeCeoList();


mybatis如下: 表中的 memberKey数据类型为Long,levelKey数据类型为Int
    <select id="selectDownGradeCeoList" resultType="map">
        SELECT memberKey,levelKey FROM ceo
        WHERE (TO_DAYS(NOW()) - TO_DAYS(nextCheckLevelDate)) = 0

    </select>


再得到数据,对数据进行判断时:

if( levelList.get(i).get("") > 0)

报错:java.lang.Integer cannot be cast to java.lang.Long.

后来代码改成:List<Map<String,String>> levelList = ceoLevelMapper.selectDownGradeCeoList();

继续报错:java.lang.Integer cannot be cast to java.lang.String

后来发现,由于数据库中的字段类型不同,应该要用Object来接收数据,然后再用toString进行转换:


List<Map<String,Object>> levelList = ceoLevelMapper.selectDownGradeCeoList();

if( Integer.parseInt(item.get("levelKey").toString()) >0 ){

        。。。

}


问题解决

### Java中 `java.lang.Integer` 无法转换为 `java.lang.Long` 的原因 在Java中,`Integer` 和 `Long` 是两个不同的包装类,分别对应于基本数据类型 `int` 和 `long`。由于它们表示的数据范围不同 (`int` 占用32位而 `long` 占用64位),因此不能直接通过强制类型转换来实现互转[^1]。 当尝试将 `Integer` 转换为 `Long` 或反之时,如果未正确处理数值的封装与解封操作,则会引发 `ClassCastException` 异常。这是因为 JVM 将这些对象视为完全独立的不同类实例,在运行时检测到不兼容的类型转换请求后便会抛出异常。 #### 正确的解决方案 为了安全地完成从 `Integer` 到 `Long` 的转换,可以采用以下方式: 1. **利用数值解析方法** 使用 `Long.valueOf(int)` 方法能够接受一个整数作为参数并返回对应的 `Long` 对象。 ```java Integer intValue = 10; Long longValue = Long.valueOf(intValue); // 安全转换 ``` 2. **自动拆箱与重新装箱机制** 如果确认源变量确实持有有效数值而非 null 值的情况下,也可以先将其拆箱得到原始 int 类型后再参与运算或者赋值给 long 变量,之后再由编译器负责重新装箱成为目标类型的对象形式。 ```java Integer integerObj = new Integer(5); Long convertedLong = (long)(integerObj.intValue()); System.out.println(convertedLong.getClass().getName()); // 输出 "java.lang.Long" ``` 以上两种途径均能有效地规避因非法强转所造成的程序崩溃风险,并且保持良好的可读性和维护性[^2]。 ### 注意事项 尽管上述技术手段解决了特定场景下的需求,但在实际开发过程中仍需注意避免不必要的复杂逻辑以及潜在性能开销。对于频繁发生的跨类型交互情况,建议审视设计模式是否存在优化空间,比如统一使用更宽泛的基础数据结构存储信息等策略减少后续加工成本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值