You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin类型转换异常:Long无法转为Integer问题咨询

解决SharedPreferences类型转换异常:Long转Integer失败

嘿,这个问题我之前踩过坑!你虽然没直接用Long类型,但SharedPreferences里"something"这个键对应的实际存储值是Long类型,这才导致了强转异常。

为什么会出现这个问题?

SharedPreferences的存储是类型严格绑定的,键和值的类型是一一对应的:

  • 如果你之前在代码的某个角落(比如旧版本代码、其他模块、甚至第三方依赖)用putLong("something", ...)存过值,哪怕现在改成用getInt去取,SP里保留的还是Long类型的数据。当调用getInt时,系统会尝试把底层存储的Long对象强转成Integer,这就触发了java.lang.Long cannot be cast to java.lang.Integer异常。
  • 还有一种可能是你在测试时通过adb命令或者其他工具给这个键存了Long值,自己没注意到。

怎么解决?

我给你几个可行的方案:

  • 统一存取值类型:检查所有涉及"something"的存值逻辑,确保全部用putInt来存,替换掉之前的putLong。如果是测试阶段,直接清除APP的存储数据,重新存值后再用getInt取就正常了。
  • 兼容旧数据:如果已经有用户安装了旧版本APP(里面存了Long值),就得做兼容处理:
    方案一:先取Long再转成Int
    val num = pref?.getLong("something", 1L)?.toInt() ?: 1
    
    方案二:判断值的类型再处理(更稳妥)
    val num = when {
        pref?.contains("something") != true -> 1
        pref.all["something"] is Long -> pref.getLong("something", 1L).toInt()
        pref.all["something"] is Int -> pref.getInt("something", 1)
        else -> 1
    }
    

内容的提问来源于stack exchange,提问作者Joe Robert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:37:31