我有一个用于绑定视图持有者的类
class ViewHolderBinder(val onBind: (ViewHolder) -> Unit, val onClick: () -> Unit)
演示者中有这些项目的列表
val items: MutableList<ViewHolderBinder> = mutableListOf()
ViewHolderBinder包含2个非null函数,但是此调用会导致编译时错误
items.getOrNull(position)?.onClick()
但是此调用可以按预期编译
items.getOrNull(position)?.let { it.onClick() }
也许我错过了一些东西,但是2这些构造完全等效,我更喜欢使用第一个构造,但是它没有编译。 我正在使用Kotlin 1.3.10
答案 0 :(得分:2)
这是您收到的实际错误消息:
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)?
,就像错误所说的一样。不允许将.
运算符应用于可为空的类型。