Это о обнуляемости.Компилятор Kotlin отслеживает, может ли каждое значение быть нулевым или нет, и не позволяет вам делать вещи, которые были бы небезопасными.
Код в этом вопросе имеет одну конкретную проблему обнуляемости.(Он также имеет некоторую путаницу, включая две ссылки на key
до того, как он будет установлен. Я предполагаю, что они должны быть siteId
.)
Проблема в том, что происходит, когда карта abcEnabled
несодержать запрошенный ключ.Если ключ присутствует, то оператор […]
вернет соответствующее значение Boolean
;но если ключ отсутствует (что может произойти, если карта не содержит ключ «по умолчанию»), он возвращает ноль.Однако переменная, которую вы пытаетесь присвоить, имеет тип Boolean
, что не допускает нулевые значения.Вот почему компилятор жалуется.
Таким образом, вам придется решить, что вы хотите, если карта не содержит ключа «по умолчанию».(Или найдите способ убедиться, что это всегда делает; но это намного сложнее, особенно если метод можно вызвать до полной инициализации объекта или когда другой поток устанавливает или обновляет карту.гораздо безопаснее обрабатывать случай изящно.)
Если вы хотите вернуть false
в этом случае, код может сводиться к:
fun getabcEnabledValue(siteId: String?): Boolean {
val key: String? = if (abcEnabled.containsKey(siteId)) siteId else "default"
return abcEnabled[key] ?: false
}
или даже (для лучшегобезопасность, а также краткость и ясность):
fun getabcEnabledValue(siteId: String?)
= abcEnabled[siteId] ?: abcEnabled["default"] ?: false
Или, если вы хотите вернуть null
в этом случае, просто объявите функцию как возвращающую Boolean?
(которая допускает нулевое значение) - или пропустите?: false
в последнем примере.
(Кроме того, из соображений стиля я не уверен, почему вы сделали abcEnabled
частным свойством, а затем добавили свой собственный установщик. Действительно ли это необходимо?скрыть получатель? Если нет, то публичное свойство будет проще. И, вероятно, стоит сделать заглавными буквы abc
в именах методов.)