从Kotlin调用Java代码时,有SAM conversion所以Java代码如下:
adapter.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view, int position) {
// Do stuff here
}
});
可以这样:
adapter.setOnClickListener { view, position ->
// Do stuff
}
现在,我正在研究Kotlin项目,我想将功能接口定义为事件监听器:
interface OnSomeActionListener {
fun onSomeAction(parameter1: Int, parameter2: String)
}
在 SomeClass
我有一个设置监听器的函数:
...
private var onSomeActionListener: OnSomeActionListener? = null
fun setOnSomeActionListener(listener: OnSomeActionListener) {
onSomeActionListener = listener
}
...
当我创建这个类的实例并尝试调用setter函数时,我这样做:
val thing = SomeClass()
thing.setOnSomeActionListener(object : OnSomeActionListener {
override fun onSomeAction(parameter1: Int, parameter2: String) {
// Do stuff here
}
})
我'm aware that Kotlin has function types therefore doesn' t支持来自各个站点的SAM转换,例如this one .
我已经阅读了一些关于函数类型的内容,但我之前没有使用它们 .
How would I rewrite my code so that I can invoke the setter function like this?
val thing = SomeClass()
thing.setOnSomeActionListener { parameter1, parameter2 ->
// Do stuff here
}
.
3 回答
函数类型如下所示:
在您的情况下,您可以使用
(View, Int) -> Unit
而不是使用接口类型 . 它看起来像这样:Add names
在函数类型中,您还可以指定参数的名称 . 这并没有太大的改变,但它们可以在这里和调用代码中添加一些清晰度,这很好 .
Using a type alias
为避免每次都输入
(View, Int) -> Unit
,您可以定义一个类型:这样你的代码现在又看起来像这样:
并称之为:
嗯,这样的事情:
欲了解更多信息:Higher-Order Functions and Lambdas
如何定义接受函数并返回接口的函数?
接口将其工作委托给
f
.然后你就可以写了