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?
相关推荐
云和数据.ChenGuang8 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠8 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
tongyiixiaohuang9 小时前
WMS已发货状态反写金蝶云星空:单策略实战教程
android
好的佩奇10 小时前
Dart 之类修饰符
android·flutter·dart
silvamux_11 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
alexhilton11 小时前
用Konsist与Lint强制执行设计系统契约
android·kotlin·android jetpack
步行cgn12 小时前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
摇滚侠12 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python
小蒜学长12 小时前
基于Spring Boot+Vue3的在线医疗咨询系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·在线问诊·在线医疗咨询系统
Deng桑12 小时前
SpringAI写第一个Agent-把工单循环跑起来
java·agent·工具调用·spring ai