Kotlin 为什么SharedReferences.getString可能返回null?
1) 在下面的图片中,我想了解为什么SharedReferences.getString()给我类型不匹配,它可能返回null,但SharedReferences.getBoolean()和SharedReferences.getInt()没有给我类型不匹配警告 2) 那么defValue呢,如果它没有找到SharedPrefKey.App_LANGUAGE它会返回en,这不是很重要吗?所以它不能返回null,wrightKotlin 为什么SharedReferences.getString可能返回null?,kotlin,sharedpreferences,Kotlin,Sharedpreferences,1) 在下面的图片中,我想了解为什么SharedReferences.getString()给我类型不匹配,它可能返回null,但SharedReferences.getBoolean()和SharedReferences.getInt()没有给我类型不匹配警告 2) 那么defValue呢,如果它没有找到SharedPrefKey.App_LANGUAGE它会返回en,这不是很重要吗?所以它不能返回null,wright 它调用可以返回字符串或null的Java代码。对于getBoolean
getBoolean()
函数,该值只能为true或false。您不能将null填充到布尔值
字段中null
放在第二个参数中,与没有默认值时相同在
SharedReferences
界面中查看getString
的实现
@Nullable
String getString(String key, @Nullable String defValue);
方法本身被标记为@Nullable
,这意味着它可以返回null。现在,如果您查看defValue
参数,您会注意到它也被标记为@Nullable
,这意味着您不必传入默认值。如果您要查找的字符串首选项不存在且未传入默认值,那么将返回null
int getInt(String key, int defValue);
boolean getBoolean(String key, boolean defValue);
如果查看上面的
getInt
和getBoolean
的实现,可以看出必须传入一个默认值,因此它永远不会为null。这就是为什么您看到了与您发布的示例在可空性方面的差异。我认为它是Java和String
类型这一事实意味着它可以返回null
。@Nullable
注释是IDE的助手。不管有没有注释,它都可能返回null
。是的,但是没有注释,Kotlin不知道这一点。如果去掉注释,那么它将返回一个平台类型字符串
和Kotlin不会将其视为可空。所以你不会犯那个错误。但是,如果它返回null agree,但是String,它就会崩溃
仍然可以是null
。我认为Kotlin假设字符串有点傻代码>一个更正确的假设是String?
,它允许IDE帮助您将安全调用写入Java。是的,但问题是他为什么会出现类型不匹配错误。如果它没有标记为@Nullable
,则不会出现编译时错误。只有在字符串
value返回null
如果提供了getString
的默认参数,为什么它仍然可以为null?