新闻详情

新闻详情

首页 / 资讯中心 / 详情

P08 · ClassCastException:类型强转翻车,Integer 变不成 String

发布时间:2026/9/5 8:43:16来源:尧图网络
P08 · ClassCastException:类型强转翻车,Integer 变不成 String
P08 · ClassCastException类型强转翻车Integer 变不成 String场景还原一段从老项目继承来的代码用原始类型 List装数据为了省事没写泛型。后来你接手把它当成ListString用——结果运行时炸了java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String编译的时候好好的一运行就崩。这正是泛型擦除给你埋的雷编译期检查的类型安全到了运行期变成了信不信由你。一、问题现象注: CastDemo.java使用了未经检查或不安全的操作。 ← 编译时就警告你了 第一个元素: 你好 Exception in thread main java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader bootstrap) at CastDemo.main(CastDemo.java:14)二、出错代码importjava.util.*;publicclassCastDemo{publicstaticvoidmain(String[]args){ListStringlistnewArrayList();// 老代码 / 反射 / JSON 反序列化里容易混入原始类型用法Listrawlist;// 原生类型 List没写泛型raw.add(你好);raw.add(123);// ❌ 往以为是 String的列表里塞了 IntegerStringfirstlist.get(0);// 没问题你好本来就能转成 StringSystem.out.println(第一个元素: first);Stringsecondlist.get(1);// ← 这里炸了Integer 无法强转成 StringSystem.out.println(第二个元素: second);}}三、为什么会这样核心原因一句话Java 的泛型在运行期会被擦除。ListString list里的String只在编译期起作用——编译器用它做类型检查往里面 add 一个 Integer 在编译期会被拦住。但编译成字节码后这个类型信息就没了运行期的List就是一个什么都能装的桶。于是这段代码干了这么件事先用原生类型List raw list绕过了编译期检查成功把Integer 123塞了进去运行期list.get(1)返回的其实是Object指向 Integer 123代码里声明了String second ...JVM 在赋值时悄悄插入了强转(String)一个 Integer 怎么可能变成 String→ClassCastException。谁最常踩这个坑老代码 / 历史遗留的原始类型集合JSON 反序列化Gson/Jackson 没指定泛型时反序列化出的 List 里元素类型不可信取出来强转随时炸反射调用返回 Object 后随手强转泛型与继承混用ListString不是ListObject的子类这类问题。四、怎么解决原则让类型从源头就干净别把类型安全寄托在运行期的强转上。方案一杜绝原始类型全程写泛型ListStringlistnewArrayList();list.add(你好);// list.add(123); // ✅ 编译期直接报错根本活不到运行期方案二从不可信来源JSON/反射取数据时先校验再强转Objectobjmap.get(age);// JSON 解析出来的 Objectif(objinstanceofInteger){// ✅ 先 instanceof 判断intage(Integer)obj;}else{// 类型不对走兜底/报错而不是直接崩溃System.out.println(age 字段类型不是数字: obj);}方案三JSON 反序列化一定带上明确的泛型// GsonTypeToken 保住泛型ListUserusersnewGson().fromJson(json,newTypeTokenListUser(){}.getType());// JacksonTypeReference 同理ListUserusers2objectMapper.readValue(json,newTypeReferenceListUser(){});五、防坑总结代码里出现裸 List/Map没泛型就是隐患尽早补上泛型编译器的未经检查的操作警告别忽略它是在提醒你这里类型不安全从 JSON/反射拿到 Object 先instanceof再强转集合别跨类型假设传递一个 List 被当两种类型用早晚出事强转失败看异常信息X cannot be cast to Y说的是 X 转不成 Y——去源头查谁把 X 塞进来的。下一篇P09 · 数字转换 NumberFormatException
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

金融工程专业大学期间适合考哪些证?就业方向与考证规划 2026/9/5 9:22:21

金融工程专业大学期间适合考哪些证?就业方向与考证规划

金融工程不是单纯学金融,也不是只写代码。它更像是金融、数学、统计、编程、风险管理的交叉专业。到 2026 年,银行金融科技岗、券商研究与衍生品岗、量化实习、风控建模、基金运营等岗位,对学生的要求已经从懂金融,逐渐变成懂金融…

阅读更多 →
STM32F103假芯片识别与排查:FreeRTOS上电无反应实战解析 2026/9/5 9:22:21

STM32F103假芯片识别与排查:FreeRTOS上电无反应实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
4-20mA电流环采集电路设计实战:从原理到STM32稳定实现 2026/9/5 9:22:21

4-20mA电流环采集电路设计实战:从原理到STM32稳定实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
先理顺6条流程,再上70个Agent:部分供应链周期缩短75% 2026/9/5 9:22:21

先理顺6条流程,再上70个Agent:部分供应链周期缩短75%

很多自动化项目一开场,就在讨论买什么工具、接哪个模型、要几个 Agent。 可真实工作里最常见的卡点,往往是另一回事:同一字段三个部门叫法不同,审批走到一半才发现缺材料,上一环节做完没人通知下一环节。这样的流程接上…

阅读更多 →
Python爬虫实战:逆向分析与反反爬策略构建闲鱼商品数据抓取工具 2026/9/5 9:22:21

Python爬虫实战:逆向分析与反反爬策略构建闲鱼商品数据抓取工具

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
1688找货源时,怎样把多家报价整理成可比较的清单 2026/9/5 9:19:21

1688找货源时,怎样把多家报价整理成可比较的清单

在1688找货源时,最容易造成误判的不是候选数量太少,而是不同商家的报价看起来相近、实际条件却不在同一范围内。有人按单价比较,有人按起订量比较,有人把包装、样品、付款、交期和运费放在备注里。若不先统一字段,低价…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞