在学习Kotlin时,我在这个Udacity项目中遇到了这个定制的这个Udacity项目接口。我明白它在做什么,但我不明白它是如何做到的。谁能给我解释一下密码吗?
/**
* Custom listener that handles clicks on [RecyclerView] items. Passes the [MarsProperty]
* associated with the current item to the [onClick] function.
* @param clickListener lambda that will be called with the current [MarsProperty]
*/
class OnClickListener(val clickListener: (marsProperty:MarsProperty) -> Unit) {
fun onClick(marsProperty:MarsProperty) = clickListener(marsProperty)
}发布于 2021-03-09 15:13:11
这很可能是Kotlin 1.4之前的一次黑客攻击,允许使用lambda构造伪接口。在Kotlin1.4之前,您只能在山姆转换接口中使用Java。在Kotlin中,如果定义了接口,则只能通过完全实现来创建接口实例,例如:
interface OnClickListener {
fun onClick(marsProperty: MarsProperty)
}
val myImplementation = object: OnClickListener {
fun onClick(marsProperty: MarsProperty) {
// do something with marsProperty
}
}但是,如果这是在Java中定义的接口,则允许您这样做:
val myImplementation = OnClickListener { marsProperty ->
// do something with marsProperty
}通过在该类的构造函数中创建函数属性,它使构造函数能够与后跟lambda语法一起使用,就像第二个代码块一样。缺点是它不再是一个接口,因此它的使用方式的灵活性较低。在将接口传递给像setOnClickListener()这样的函数时,仍然不能使用跟踪lambda语法,因此它看起来类似于其中的一个,这取决于您选择如何定义setter (作为函数或属性):
someView.setOnClickListener(OnClickListener { marsProperty ->
// do something with marsProperty
})
// or
someView.onClickListener = OnClickListener { marsProperty ->
// do something with marsProperty
}而且您不能让一些多用途类实现接口,因为没有接口。例如,有些人使用让Android活动实现单击监听器接口的模式,并将活动实例本身作为侦听器传递给各种视图。
在Kotlin1.4中,您现在可以通过使用fun来将接口定义为功能性。然后,SAM转换将与它们一起工作,就像在Java中定义的接口一样。
fun interface OnClickListener {
funonClick(marsProperty: MarsProperty)
}
val myImplementation = OnClickListener { marsProperty ->
// do something with marsProperty
}
// or
someView.setOnClickListener { marsProperty ->
// do something with marsProperty
}发布于 2021-03-09 07:22:53
它可以写成这样:
class OnClickListener {
val clickListener: (marsProperty: MarsProperty) -> Unit//function type variable which accepts parameter of MarsProperty type
constructor(_clickListener: (marsProperty: MarsProperty) -> Unit) {//constructor of class
clickListener = _clickListener
}
fun onClick(marsProperty: MarsProperty) {
clickListener(marsProperty)//calling of clickListener with parameter of marsProperty
}
}clickListener是一个函数类型变量,它接受MarsProperty类型的参数,不返回任何结果。
(marsProperty: MarsProperty) = clickListener(marsProperty)是一个单一的表达式函数。
OnClickListener(val clickListener: (marsProperty:MarsProperty) -> Unit)正在声明主构造函数。
https://stackoverflow.com/questions/66541938
复制相似问题