Map<String,Object>接收参数,Long类型降级为Integer,报类型转换异常
前言
今天看群里小伙伴问了一个非常有意思的问题:
使用 Map<String,Object> 对象接收前端传递的参数,在后端取参时,因为接口文档中明确该字段类型为 Long ,所以对接收的参数进行了强转,即 (Long)参数 ,但是却发生了类型转换异常,报错信息如下:
class java.lang.Integer cannot be cast to class java.lang.Long
(java.lang.Integer and java.lang.Long are in module java.base of loader 'bootstrap')
发现好几个小伙伴也有疑惑,干脆直接码一篇文章解答一下,希望对有此疑惑的小伙伴有所帮助。
Long 类型降级
我们先通过测试数据、测试方法来还原一下问题。
测试json数据如下:
{
"user_name": "niceyoo",
"age": -24,
"money": 2147483646
}
测试test方法如下:
@PostMapping("/test")
@ResponseBody
public void test(@RequestBody Map<String,Object> params) {
String userName = (String) params.get("user_name");
Integer age = (Integer) params.get("age");
Long money = (Long) params.get("money");
System.out.println(String.format("user_name=%s,age=%s,money=%s",userName,age,money));
}
如上传递了三个参数,即用户名、年龄、金额这三个字段,如下是调用情况:

通过截图下方断点参数可以看到接收的 age 、money 都是 Interger 类型,而代码中 money 使用 Long 强转的话会报 java.lang.Long cannot be cast to java.lang.Integer 异常,至此问题就还原出来了。
不懂就问:为什么接收的 money 是 Integer 类型,强转后会报错?
首先我们先来看为什么接收的 money 是 Integer 类型。
使用 Map<String,Object> 接收的 Long 数值如果处于 「 Integer.MIN_VALUE ~ Integer.MAX_VALUE 」 是会自动转换成 Integer 的。
不光是接收,同样直接使用 Map<String,Object> 存入数据符合这个范围,仍然也会被认为存入的是 Integer 类型,我们可以把它看做一种潜在的优化,毕竟 Long 类型使用的字节数要大于 Integer 。
Integer.MAX_VALUE,Integer 类型的最大值,
Integer.MIN_VALUE,Integer 类型的最小值,
这两个值可以直接通过 sout 打印查看:
- System.out.println(Integer.MAX_VALUE): 2147483647
- System.out.println(Integer.MIN_VALUE): -2147483648
我们来验证一下,将 money 的值改成大于 Integer.MAX_VALUE:

同样的,如果传递的值小于 -2147483648,那么同样接收的类型为 Long,大家可以验证一下。
为什么强转后会报错?
强转的一些条件:
- 低阶转高阶可以直接转;
- 高阶转低阶需要强制转换,否则报错;
- 强转 null 值报错;
- 包装类型数据不支持直接跨类型强转;
其实报错的原因就是这最后一条,包装类型是不支持直接跨类型强转的,比如,你可以使用 Integer 跟 int 的直接转换,但是你不能将 Integer 直接强转成 Long 类型,或者 Long 类型强转 Integer ,这样都是报错的。
如果不能确定接收的对象是 Long 还是 Integer 怎么办?
既然知道不能强转了,但是如果不知道接收的对象是什么类型怎么办?
因为这种情况下,你不知道接收的对象到底是超过 Integer 这个范围还是没有超过。
第一种解决方法就是对接收的对象进行类型判断。
主要就是使用关键字 — instanceof

如图所示,我们可以先用 Object 接收一下对象,然后对其通过 instanceof 关键字进行类型判断,如果是 Integer 类型,则先 .toString(),然后再使用 Long.parseLong() 进行转换,如果本身就是 Long,则直接进行强转,同理,接收 Integer 类型也一样,无非就是换用 Integer.parseInteger().
第二种就是直接使用实体接收,使用实体接收就不会存在此问题了。

博客园持续更新,欢迎关注,希望这篇文章对你有所帮助。
博客园:https://www.cnblogs.com/niceyoo
Map<String,Object>接收参数,Long类型降级为Integer,报类型转换异常的更多相关文章
- dao层取值用List<map<String,Object>>接收有序map
发现一个好玩的Map, 当需要Map有序时用java.util.LinkedHashMap接收,是有序map resultType="java.util.LinkedHashMap" ...
- MyBatis 返回Map<String,Object>类型
<!-- 导出所有数据 --> <select id="exportAll" resultMap="map"> SELECT t1.ME ...
- 当我写下Map<String,Object> map = new HashMap<>() https://www.jianshu.com/p/6b2e350e99be
当我写下Map<String,Object> map = new HashMap<>();我到底在写什么? 我什么时候会写HashMap? 一个函数同时需要返回 多种 状态的情 ...
- 使用 JDBC 和 JavaTemplate 查询SQL语句返回 List<Map<String,Object>>
使用JDBC执行sql语句返回List 类型: public class JdbcUtil { private static Log log = LogFactory.getLog(JdbcUtil. ...
- 迭代输出Map和List<Map<String,Object>>的方法
一.Map<String,Object> String:key的类型 Object:value的类型,value可能是String,或者int类型,什么类型都可以 对于Map接口来说,本身 ...
- POST 发送HTTP请求入参为:String url, Map<String, Object> propsMap
/** * 发送HTTP请求 * * @param url * @param propsMap * 发送的参数 */ public static String httpSend(String url, ...
- List<Map<String, Object>>取值
List<Map<String, Object>> postlist //一个list里面装着多个map,如下 [ {A=0100, B=4}, {A=0200, B=3}, ...
- 笔记 freemark list标签迭代Map<Map<String,Object>集合排序问题
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. 工作中出现一个比较特殊的问题,在模板ftl文件中,一般用list迭代map 举例: 后台: // 传入的参数 ...
- JAVA中对List<map<String,Object>>根据map某个key值进行排序
方法compareTo()比较此对象与指定对象的顺序.如果该对象小于.等于或大于指定对象,则分别返回负整数.零或正整数.返回整数,1,-1,0:返回1表示大于,返回-1表示小于,返回0表示相等. 普通 ...
随机推荐
- ETCD核心机制解析
ETCD整体机制 etcd 是一个分布式的.可靠的 key-value 存储系统,它适用于存储分布式系统中的关键数据. etcd 集群中多个节点之间通过Raft算法完成分布式一致性协同,算法会选举出一 ...
- P4683 [IOI2008] Type Printer 打印机
题意描述 [IOI2008] Type Printer 打印机 几百年前的 IOI 的题目还是很好的呀. 给你一个 诡异的 打印机,它只能用已有的字符来打印,而且必须每一个都用到.(这岂不是活字印刷术 ...
- AC86U kx上网
AC86U收到很久了,为了能够kx上网免不了一番折腾. 准备 U盘一个, 读写速度要大于30M/s, 用于制作虚拟内存 步骤大致如下: 1.下载koolshare固件 我这里下载的是官改固件:http ...
- CF295C Greg and Friends
首先 我们考虑每次船来回运人时都可以看成一种dp状态 又因为人的体重只有50kg和100kg两种, 所以我们可以开一个三维数组dp[i][j][k],第1维表示在出发岸50kg有i个,第2维表示在出发 ...
- CO函数库
CO函数库 用于 Generator 函数的自动执行,co函数返回一个promise对象 Generator 函数: 协程的概念:A执行- A暂停,执行权给B--- B交回执行权--- A恢复执行 G ...
- first day for my bolg
做为一名毕业不久的兢兢业业的前端小白,傻到一直用word做笔记,还有各种手抄(捂脸),下定决心以后改用博客,据说大神们都是这么做的!嘿嘿,先把各种笔记腾上来,内容实在惨不忍睹各种智商感人,希望不要有人 ...
- leetcode4:sort-list
题目描述 在O(n log n)的时间内使用常数级空间复杂度对链表进行排序. Sort a linked list in O(n log n) time using constant space co ...
- C#两行代码实现三维地球
一. 为什么要用三维地球? 三维地球是地理信息技术的一个重要发展方向,相比较二维地图技术,三维地球最大的特点是更直观更形象地表达地理信息和空间上的方位.我们可以在三维气象模拟. ...
- linux命令使用 cut/sort/uniq
我记得之前去XX网面试的那个面试题是这样的:有个apache.log 文件文本内容如下:======================[niewj@centSvr ~]$ cat apache.log ...
- [MIT6.006] 22. Daynamic Programming IV: Guitar Fingering, Tetris, Super Mario Bro. 动态规划IV:吉他指弹,俄罗斯方块,超级玛丽奥
之前我们讲到动态规划五步中有个Guessing猜,一般情况下猜有两种情况: 在猜和递归上:猜的是用于解决更大问题的子问题: 在子问题定义上:如果要猜更多,就要增加更多子问题. 下面我们来看如果像背包问 ...