【发布时间】:2021-03-17 23:08:36
【问题描述】:
在 Kotlin 中设置点击监听器时,我们可以这样写:
rollButton.setOnClickListener(
object: View.OnClickListener {
override fun onClick(v: View?) {
rollDice();
}
}
)
SAM转换后,我们可以写成:
rollButton.setOnClickListener({ v -> rollDice() })
但我注意到 kotlin 也接受:
rollButton.setOnClickListener(View.OnClickListener() { v -> rollDice() })
还有
rollButton.setOnClickListener(View.OnClickListener { v -> rollDice() })
我想知道这里发生了什么?我的意思是 setOnClickListener 应该使用匿名类或 SAM 速记之类的东西来实现 OnClickListener。这是某种中间阶段还是什么?
非常感谢任何解释或资源链接。
【问题讨论】:
-
因此你可以写
rollButton.setOnClickListener({ v -> rollDice() })甚至rollButton.setOnClickListener { v -> rollDice() }之类的东西 -
现在我了解了 SAM 转换实际上是什么,
rollButton.setOnClickListener({ v -> rollDice() })是如何工作的?接口名称不见了! -
编译器知道
setOnClickListener需要OnClickListener。