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.
问题原因
-
在 Kotlin 中,SharedPreferences 的 SharedPreferences 方法返回的是可空字符串
String? -
而函数声明返回的是非空字符串 String,因此会报 Type mismatch 错误
处理策略
- 返回非空字符串(推荐):使用
?:提供默认值,确保返回值非空
kotlin
fun getString(context: Context, fileName: String, key: String): String {
val sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE)
return sharedPreferences.getString(key, "") ?: ""
}
- 返回可空字符串,修改函数返回值类型为
String?
kotlin
fun getString(context: Context, fileName: String, key: String): String? {
val sharedPreferences = context.getSharedPreferences(fileName, Context.MODE_PRIVATE)
return sharedPreferences.getString(key, "")
}
- 使用扩展函数:为 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)
}
- 强制转换:明确告诉编译器这里不会为 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, "")
补充学习
-
在上述代码中,如果 key 不存在,确实会返回默认值空字符串
"",而不会返回 null -
但 Kotlin 编译器仍然会报 Type mismatch 错误,这是由方法签名决定的,getString 方法的方法签名如下
kotlin
abstract fun getString(
key: String!,
defValue: String?
): String?