Android 开发问题:SharedPreferences 的 getString 方法返回值类型 Type mismatch 问题

kotlin 复制代码
fun getString(context: Context, fileName: String, key: String): String {
    val sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE)
    return sharedPreferences.getString(key, "")
}
  • 在 Android 开发中,上述代码报如下错误信息

    Type mismatch.

问题原因
  1. 在 Kotlin 中,SharedPreferences 的 SharedPreferences 方法返回的是可空字符串 String?

  2. 而函数声明返回的是非空字符串 String,因此会报 Type mismatch 错误

处理策略
  1. 返回非空字符串(推荐):使用 ?: 提供默认值,确保返回值非空
kotlin 复制代码
fun getString(context: Context, fileName: String, key: String): String {
    val sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE)
    return sharedPreferences.getString(key, "") ?: ""
}
  1. 返回可空字符串,修改函数返回值类型为 String?
kotlin 复制代码
fun getString(context: Context, fileName: String, key: String): String? {
    val sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE)
    return sharedPreferences.getString(key, "")
}
  1. 使用扩展函数:为 SharedPreferences 添加扩展函数,避免重复处理空值
kotlin 复制代码
private fun SharedPreferences.getStringNonNull(key: String, defValue: String = ""): String {
    return getString(key, defValue) ?: defValue
}
kotlin 复制代码
fun getString(context: Context, fileName: String, key: String): String {
    val sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE)
    return sharedPreferences.getStringNonNull(key)
}
  1. 强制转换:明确告诉编译器这里不会为 null
kotlin 复制代码
fun getString(context: Context, fileName: String, key: String): String {
    val sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE)
    return sharedPreferences.getString(key, "")!!
}
kotlin 复制代码
return sharedPreferences.getString(key, "")
补充学习
  1. 在上述代码中,如果 key 不存在,确实会返回默认值空字符串 "",而不会返回 null

  2. 但 Kotlin 编译器仍然会报 Type mismatch 错误,这是由方法签名决定的,getString 方法的方法签名如下

kotlin 复制代码
abstract fun getString(
    key: String!, 
    defValue: String?
): String?
相关推荐
北京自在科技1 小时前
谷歌 Find Hub 迎来新版本更新
android·安卓
鹿角片ljp2 小时前
KV Cache 解析
java·算法
captain3762 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
惊讶的猫2 小时前
意图识别置信度和检索重排的分数
java
caoerzhong3 小时前
仓库管理数字化趋势解读:JeeWMS 开源 Java WMS 视角下的五个演进方向
java·开源
程序员JerrySUN3 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
Joy T4 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者4 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
天若有情6734 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++