Ненулевой тип в пустых ссылках - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть класс для привязки держателя представления.

class ViewHolderBinder(val onBind: (ViewHolder) -> Unit, val onClick: () -> Unit)

В презентаторе есть список этих элементов

val items: MutableList<ViewHolderBinder> = mutableListOf()

ViewHolderBinder содержит 2 ненулевые функции, но этот вызов вызываетошибка времени компиляции

items.getOrNull(position)?.onClick()

Однако этот вызов компилируется, как ожидалось

items.getOrNull(position)?.let { it.onClick() }

Возможно, я что-то пропустил, но 2 эти конструкции полностью эквивалентны, и я предпочитаю использовать первую, ноэто не компиляция.Я пользуюсь kotlin 1.3.10

1 Ответ

0 голосов
/ 07 декабря 2018

Вот фактическое сообщение об ошибке, которое вы получаете:

Reference has a nullable type '(() -> Unit)?', use explicit '?.invoke()' to make a function-like call instead

Предположим, у вас был этот код:

val binder: ViewHolderBinder? = getBinder()
binder?.onClick()

onClick() не является функциейВы можете вызвать экземпляр ViewHolderBinder.Это свойство , которое содержит объект обратного вызова.Полный синтаксис для вызова этой функции обратного вызова:

binder?.onClick?.invoke()

Kotlin также предлагает специальный сокращенный синтаксис, который будет работать с ненулевым binder:

binder.onClick()

Если вы примените егодля связующего с нулем,

binder?.onClick()

расширяется до

binder?.onClick.invoke()

Тип выражения binder?.onClick равен (() -> Unit)?, как говорится в ошибке.Вам не разрешено применять оператор . к типу Nullable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...