如何将Long类型的CPU统计值转换为Float和Integer类型?
解决Java中Long对象转Float/Integer时的ClassCastException问题
嘿,这个问题我在项目里碰到好多次了,咱们来捋清楚为啥会报错,以及怎么解决~
首先得搞明白你报错的核心原因:你代码里的get("system_cpu_usage")返回的是一个Long对象,而Java里引用类型之间不能跨类型直接强转——比如Long和Float是平级的包装类,没有继承关系,你直接写(float) Long对象,JVM会误以为你要把Long对象强制转成Float对象再拆箱,这肯定会抛出ClassCastException的。
下面给你两种靠谱的解决方案:
方案一:明确转成Long后再转目标类型
先把返回值正确强转为Long对象,再通过包装类的方法或者自动拆箱转成float/integer:
// 先强转成Long对象(确保类型匹配) Long systemCpuUsage = (Long) Docker.getStatistics("ENVX").getCpuStats().get("system_cpu_usage"); // 转float的两种方式 float floatValue = systemCpuUsage.floatValue(); // 或者利用自动拆箱转成long基本类型后再转float float floatValue = (float) systemCpuUsage; // 如果要转Integer的话 int intValue = systemCpuUsage.intValue();
方案二:通用型(兼容多种数值类型)
如果不确定返回的数值类型(比如有可能是Integer、Long甚至Short),可以先转成Number(所有数值包装类的父类),再转成目标类型,兼容性更强:
Number systemCpuUsage = (Number) Docker.getStatistics("ENVX").getCpuStats().get("system_cpu_usage"); // 转float float floatValue = systemCpuUsage.floatValue(); // 转Integer int intValue = systemCpuUsage.intValue();
这么处理就不会再报类型转换的异常啦,本质就是先拿到正确的数值包装类对象,再通过它的转换方法或者拆箱后转基本类型,而不是直接跨引用类型强转。
内容的提问来源于stack exchange,提问作者sadas
相关产品推荐
相关产品推荐

