"Умные" преобразования в Kotlin
В этой заметке поговорим про Smart casts или "умные" преобразования.
При некоторых обстоятельствах можно проверить, существуют ли у nullable-типа какое-нибудь значение, кроме null. Если да, то появляется возможность использовать переменную так, как будто она не является null:
Из кода видно, что при использовании nullable-значения authorName отсутствуют восклицательные знаки. Такое использование nullable-проверок -- это пример smart cast либо умного преобразования типов.
Когда nullable-переменная содержит значение, то if-выражение выполняет 1-й блок кода, где Kotlin умным образом преобразует authorName к стандартному не-null типу String. Если же nullable-переменная не содержит значения (null), то выражение if будет выполнять блок else.
Следует отметить, что применение smart cast считается более безопасным, чем утверждение не-null значения посредством оператора !!. При этом лучше задействовать smart cast всегда, когда у nullable-типа значение может быть null. Ну а утверждение не-null значения подойдет лишь в одном случае -- когда nullable гарантированно содержит значение.
Кроме вышесказанного, применение smart cast будет полезным, когда nullable проверен и не будет после этого меняться. Например, когда nullable присваивается переменной, неизменяемой как после умного преобразования, так и перед использованием либо после присвоения константе.
Собственно говоря, знание этих нюансов позволит вам безопасно заглядывать внутрь nullable-типа и извлекать значения, если они там присутствуют.
По материалам https://kotlins.org/null.