java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

2023-10-30

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

问题背景

  • 接口中参数为 Map<String,Object>取出某 KEY 值时,强制将其转为 String ,出现上述异常

问题分析

  • Map<String,Object> 作为参数的原因:可以传递多个参数;若使用 PO 类作为参数,不同项目中引用时需升级版本;
  • 出现问题的原因:对外提供接口,没有在接口上明确注释,某个key的value是什么类型,只有当时写此接口的人才会避免此问题,其他调用者则不清楚,在调用接口后对结果进行了强制转换
  • 代码级别分析:问题的根本是泛型与Object的区别
// 示例:模拟将Integer存入Map,取出后强制转为String
    public static void main(String[] args) {
        Map<String,Object> params = new HashMap<String,Object>();
        // value为 int 类型
        params.put("1", 1);
        // 取出 value 转为 String 
        // 运行时此处出现
        // java.lang.Integer cannot be cast to java.lang.String
        String result = (String)params.get("1");
        System.out.println(result);

    }

问题:

  • map.get(“”) 返回类型为 Object ,为何将 Object 转为 String 时出现异常?
// java -version 1.7.0_79 源码
// 1. java.util.Map 的数据结构
// HashMap 为解决hash冲突使用链地址法:
// 整体是一个数组结构,数组中每个位置存放一个链表,Entry 为链表中的一个节点
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
// 从 Entry<K,V> 得出,其中 K,V 都是泛型

// 2. java.util.HashMap 中 put方法
public V put(K key, V value) {
}
// 方法中的参数类型均为泛型,与 Entry 对应

// 3.泛型的优势
// 编译期可确认数据类型

// 4.泛型与Object 的区别
// 使用泛型取值,无需类型转换; Object 需要转换
// 使用泛型作为参数,在编译期可检测数据类型不一致的问题
// 如:
Map<String,Object> params = new HashMap<String,Object>();
params.put("1",1);
params.put(2,2) ; // 编译期出现异常提示;K k ,指定 K 泛型的数据类型为 String 

// 5.JVM 在编译器根据执行的泛型的数据类型擦除泛型
// JVM 中无泛型的概念
// JVM 编译时根据指定的数据类型,如上例中,VALUE 为 int 类型
// JVM 编译代码后,VALUE  变为 int 类型

// 6.分析上述例子中的结果
        Object object = params.get("1");
        if(object instanceof Integer){
            System.out.println("true"); // 控制台打印 true 
            // 由输出结果可知:虽然map中取出的结果是 Object ,但其实质是 Integer ,故在将其强制转为 String 时会出现强制类型转换的异常
        }
// 示例:解决方法
        String result1 = String.valueOf(object);
        // String.valueOf 实质调用 object.toString() 方法
        System.out.println(result1);

问题总结

  1. Map<String,Object>作为接口参数类型时要注明可以接收的KEY与对应VALUE的数据类型
  2. Map<String,Object> params取值时,要注意可能出现转换异常,为避免出现上述问题,可通过 instanceOf 判断;可使用toString() / String.valueOf() 将其先转为 String 再转为需要的数据类型

泛型

泛型常用表示及含义

  • E – Element (在集合中使用,因为集合中存放的是元素)
  • T – Type(Java 类)
  • K – Key(键)
  • V – Value(值)
  • N – Number(数值类型)
  • ? – 表示不确定的java类型(无限制通配符类型)
  • S、U、V – 2nd、3rd、4th types

参考资料

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String 的相关文章

  • Gof23设计模式之简单工厂/静态工厂模式

    在java中 万物皆对象 这些对象都需要创建 如果创建的时候直接new该对象 就会对该对象耦合严重 假如我们要更换对象 所有new对象的地方都需要修改一遍 这显然违背了软件设计的开闭原则 如果我们使用工厂来生产对象 我们就只和工厂打交道就可
  • JavaScript 检查变量是否为 null 或 undefined

    当它的左侧操作数为null 或 undefined时 返回右侧的操作数 否则返回其左侧的操作数 用法 想检查一个变量是否为 null 或 undefined 时 操作符很有用 const foo null Hello console log
  • python小游戏 推箱子小游戏设计与实现

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3 1 环境配置 3 2 Pygame介绍 4 具体实现 5 最后 0 项目简介 Hi 各位同学好呀 这里是L学长 今天向大家分享一个今年 2022 最新完成的毕业设计项目作
  • Spring之@AutoWired注解

    开发中依赖注入一般用 AutoWired 首先需要bean xml文件中需要配置
  • C语言字符串必备练习题

    1 作业标题 633 字符串的结束标志是 作业内容 A 是 0 B 是EOF C 是 0 D 是空格 答案解析 C语言规定 以 0 作为有效字符串的结尾标记 A 错误 是 0 不是字符0 B EOF一般用来作为检测文本文件的末尾 C 正确
  • 机器学习笔试题汇总

    文章目录 树 特征工程 样本处理 K近邻 聚类 深度学习 分类 距离 相似度 指标性能评价 HMM 数学 为什么将回归问题转化成分类问题 解空间变小 softmax和sigmoid的区别 为什么用多项分布 多项分布能天然刻画值域变化趋势的
  • 演讲文档和视频《元宇宙与区块链IT基础设施》下载

    当今科技迅猛发展 知识爆炸的时代 有些知识 非公司保密信息 及那些不需要申请知识产权 构建护城河的信息 不及时分享 就过期了 重要的是 构建个人知识壁垒的根本是 快速迭代学习和交流碰撞 另外 我希望能遇到更多有共鸣 相互启发的朋友 我的QQ
  • RESETLOGS

    使用resetlogs选项 会把当前的日志序号 log sequence number 重设为1 并抛弃所有日志信息 在以下条件时需要使用resetlogs选项 在不完全恢复 介质恢复 使用备份控制文件 使用resetlogs打开数据库后
  • AttributeError: module ‘networkx‘ has no attribute ‘from_numpy_matrix‘解决方法

    在我学习louvain算法时 运行了这样一段代码 from communities algorithms import louvain method from communities visualization import draw co
  • 初次使用QT5串口类QSerialPort

    因为工作需要 现在正在学习Qt的串口通信 Qt4的话需要使用第三方类 使用起来也非常简单 只需要把对应的文件添加到自己的项目中就可以了 我参考的是Qt论坛上的demo 刘大师和yafei的demo都非常详细 网上都可以下载到 不过 Qt5添
  • Elementui设置样式不起效

    在使用ElementUI时 其渲染的dom元素有时是在模板外的 虽然代码写在了vue文件对用的模板内 但elementui在渲染的时候可能会渲染到和body一级 如这种弹窗 有时候想给这种el dialog加个样式 发现是不起效的 原因是
  • VCS命令行CTRL+C后dump完整的fsdb波形

    UCLI命令行CTRL C后dump完整的fsdb波形 1 ucli fsdbDumpFinish 2 ucli fsdbDumpvars 0 harness mda struct 如果仿真过程中直接CTRL C会调到UCLI接口 此时如果
  • 工作不好找,普通打工人如何破局

    大家好 我是苍何 我的一位阿里朋友被裁后 找工作找了一个月都没结果 很多到最后一面被pass了 不由得做一下感慨 即使是大厂背景又如何 面对经济环境和大环境市场 每个人都不容易 我身边很多都是程序员群体 最近也在在编程导航 收到了很多小伙伴
  • 13.linux进程基础

    一 进程基础 基础概念 关于进程和线程的基本概念在操作系统中早已学过 可以概括为一下几点 根本区别 进程是操作系统资源分配的基本单位 而线程是处理器任务调度和执行的基本单位 资源开销 每个进程都有独立的代码和数据空间 程序上下文 程序之间的
  • Unable to negotiate with 172.16.28.137 port 22: no matching host key type found. Their offer: ssh-rs

    Unable to negotiate with 172 16 28 137 port 22 no matching host key type found Their offer ssh rsa ssh dss ssh连接服务器报错 Un
  • 数字化转型升级是企业的一项重要决策

    无独有偶 世界经济数字化转型是一个大命题 也是一个大趋势 未来一段时期 数字经济将成为拉动经济增长的一个重要引擎 各行业各领域数字化转型步伐将大大加快 不论是行业老大 还是国家政策 数字化转型都纷纷提上了日程 看来 在2020年 进行数字化
  • 贪吃蛇的小程序

    1 创建项目 1 打开微信开发者工具如图所示的界面 点击 2 填写项目以后 点击确定即可 如图所示 2 编程 1 编写index wxml的代码如下
  • ITIL是什么意思?ITIL是什么?

    ITIL是什么 ITIL是Information Technology Infrastructure Library的缩写 即 信息技术基础架构库 ITIL是由英国政府部门CCTA Central Computing and Telecom
  • 解决 hsdb jinfo jmap sa-jdi等mac不可用问题

    mac 使用 hsdb 调试的时候报错 hsdb gt attach 3196 Attaching to process 3196 please wait ERROR attach task for pid 3196 failed os k

随机推荐