Kotlin apply lambda作用域内为何可直接调用外部类成员方法?
问题原因
你对apply函数接收者的基础认知没有错,但忽略了Kotlin带接收者lambda的作用域查找规则:
binding.apply {}传入的lambda确实将binding设为了默认的隐式接收者,无修饰符的方法/属性调用会优先在binding的成员列表中匹配- 当当前层的隐式接收者中找不到匹配签名的方法/属性时,Kotlin不会直接抛出找不到成员的错误,会自动逐层向外层词法作用域继续查找匹配项
你的代码里调用setSectionVisibility(topItemSections) {.....}时的实际查找逻辑是:
- 首先在
binding对应的ViewBinding生成类中查找签名匹配的setSectionVisibility方法,查找不到 - 自动向外跳转到
bind方法所属的CompetitionDetailsViewHolder类作用域,在类成员中找到了定义的私有setSectionVisibility方法 - 隐式使用外部类实例
this@CompetitionDetailsViewHolder作为接收者完成调用,不需要你手动写限定符
这个逻辑和你能在lambda里直接访问bind方法内定义的局部变量topItemSections完全一致,都是词法作用域的标准查找逻辑——带接收者的lambda只是把接收者的成员放在了查找优先级的最高位,不会屏蔽外层作用域的任何成员。
注意事项
如果你的binding类中刚好存在一个同名、同参数签名的setSectionVisibility方法,无修饰符的隐式调用会优先执行binding的方法。此时如果要强制调用外部类的方法,必须显式指定接收者:
binding.apply { val topItemSections = sectionsMap?.get(true)?.take(2) ?: emptyList() // 显式指定调用外部类的方法,避免和binding的同名方法冲突 this@CompetitionDetailsViewHolder.setSectionVisibility(topItemSections) { } }
内容的提问来源于stack exchange,提问作者Eitanos30
相关产品推荐
相关产品推荐

