说明这个Kotlin函数结构
我正在使用这个Kotlin函数。我知道我们有一个叫做mPasswordView!!.setOnEditorActionListener
的函数,它的参数是TextView.OnEditorActionListener
,但那是什么?我们在参数里面有大括号?说明这个Kotlin函数结构
mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent ->
if (id == R.id.login || id == EditorInfo.IME_NULL) {
attemptLogin()
[email protected] true
}
false
})
您示例中使用的功能是SAM constructor。 setOnEditorActionListener
侦听器将OnEditorActionListener
作为其参数。此接口只有一个必须实现的方法,这使得它成为单一抽象方法(SAM)接口。
了在Java中使用这种方法将是完整的语法:
mPasswordView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
attemptLogin();
return true;
}
});
的一到一个转换到科特林会给你:
mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{
override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
attemptLogin()
return true
}
})
科特林,但是,让你使用以更简洁的语法将SAM接口作为其参数的方法,而不是传入lambda。这就是所谓的SAM转换:
mPasswordView.setOnEditorActionListener { v, actionId, event ->
attemptLogin()
true
}
SAM转换是自动确定哪些接口这个拉姆达对应的,但你可以通过使用一种叫做SAM构造明确指定它,这是什么在你的示例代码。 SAM构造函数返回一个实现给定接口的对象,并将传递给它的lambda传递给它的单个方法的实现。
mPasswordView.setOnEditorActionListener(TextView.OnEditorActionListener { v, actionId, event ->
attemptLogin()
true
})
这在这种特定情况下是多余的,因为只有一种方法叫setOnEditorActionListener
。但是,如果有多个具有相同名称的方法,它们使用不同的接口作为参数,则可以使用SAM构造函数指定要调用的方法的哪个重载。
“@ OnEditorActionListener”需要什么? – azizbekian
该语法可用于指定在嵌套函数的情况下从哪个函数返回。看到这里:https://kotlinlang.org/docs/reference/returns.html#return-at-labels。但我相信在这个特定情况下它实际上是多余的。 – zsmb13
所以与其他词的结构如下(我只想离开这个这里有人需要帮助,理解它):
function_A (parameters_A { override_parameters_B -> override_function_B })
其中overriden_function_B
是对象的构造函数,称为parameters_A
。
好吧,我的错误。这不是一个功能...... –