可空引用中的非空类型

时间:2018-12-07 11:03:54

标签: kotlin

我有一个用于绑定视图持有者的类

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

1 个答案:

答案 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)?,就像错误所说的一样。不允许将.运算符应用于可为空的类型。