Похоже, компилятор Kotlin добавляет в null
возврат, если let
не выполняется. Вероятно, это ошибка, так как она не должна компилироваться, и не в предыдущих версиях Kotlin.
Если мы просто скомпилируем ваш пример, мы получим это:
@NotNull
public final String handle() {
return null;
}
Я думаю, что это просто оптимизация компилятора, поскольку null?.let()
никогда не выполнится.
Использование фактической переменной дает:
@NotNull
public final String handle() {
return someNullableVariable != null ? "Ololo" : null;
}
Другими словами, let()
не выполняется, если его ссылка null
. Однако, поскольку эта функция должна что-то возвращать, компилятор просто сообщает ей, чтобы она возвращала null
, поскольку больше ничего она не могла бы вернуть.
Поскольку функция помечена @NotNull
, Kotlin будет выполнять нулевую проверку всего, что ссылается на функцию:
fun someOtherMethod() {
handle().trim()
}
становится
public final void someOtherMethod() {
String handle = handle();
if (handle != null) {
StringsKt__StringsKt.trim(handle).toString();
return;
}
throw new Exception("null cannot be cast to non-null type kotlin.CharSequence");
}
Есть два способа справиться с этим. Вы можете изменить тип возврата на handle()
на String?
:
fun handle(): String? {
someNullableVariable?.let { return "Ololo" }
}
Или вы можете вернуть что-то еще, если переменная равна нулю:
fun handle(): String {
someNullableVariable?.let { return "Ololo" }
return "someNullableVariable was null"
}