Почему этот ненулевой val становится «обнуляемым»? - PullRequest
0 голосов
/ 21 февраля 2019

Итак, у меня есть простой класс обратного вызова:

class Callback<T>(
    val onResponse: (T) -> Unit,
    val onError:(Throwable)->Unit
)

Теперь я хочу реализовать метод, который обрабатывает ошибки.Может быть или не быть callback, который должен быть вызван.

private fun handleServerError(error:IServerError, callback:Callback<*>? = null){
    val reason = error.cause

    when(reason){
        is Because.ServerRejectsLogin -> {
            doAsync { uiThread { mainActivity.longToast("sorry, your session timed out. please log in again.") } }
            IntentManager.doLogin(mainActivity)
        }
        else -> callback?.onError(reason)
    }
}

Это приводит меня к ошибке:

Ссылка имеет тип Nullable ((Throwable) -> Unit)? использовать явный?.invoke() для вызова функции, вместо этого

Кажется, что это

else -> callback?.onError?.invoke(reason)

, и я не совсем понимаю, почему.Разве тот факт, что callback не является нулевым, достаточен для того, чтобы определить, что должна быть ненулевая onError функция?

Чтобы добавить оскорбление к травме, если я напишу

else -> callback?.let{it.onError(reason)}

тогда он принимает это, но не раньше, чем предупреждает меня, что я должен

удалить избыточный .let вызов

1 Ответ

0 голосов
/ 21 февраля 2019

Синтаксис callback?.onError() будет правильным, если вы вызываете функцию с именем onError для объекта callback с оператором безопасного вызова.Однако в этом случае вы сначала читаете свойство callback, а затем вызываете другую функцию для возвращаемого свойства.

Таким образом, вместо выражения, состоящего только из одного шага и двух частей:

callback   ?.onError()

На самом деле у вас есть выражение из трех частей с двумя операторами в строке:

callback   ?.onError   ()

Последний шаг, (), - это вызов invoke оператор объекта, который onError возвращает:

callback   ?.onError   .invoke()

Однако, поскольку свойство onError читается с оператором безопасного вызова, этот объект может быть null.В этом случае вы не можете использовать invoke в форме оператора (кстати, то же самое относится и к любому другому оператору), поэтому вы должны явно записать его, добавив еще один безопасный вызов:

callback   ?.onError   ?.invoke()

Что касается намеренного действия, сообщающего вам, что вы можете удалить избыточное let: это ошибка, о которой нужно сообщить средство отслеживания проблем .

...