解释这个Kotlin函数结构
Explain this Kotlin function structure
我正在使用这个 Kotlin 函数。我知道我们有一个名为 mPasswordView!!.setOnEditorActionListener
的函数,它接受参数 TextView.OnEditorActionListener
,但它后面的是什么?我们在参数里面有大括号?
mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent ->
if (id == R.id.login || id == EditorInfo.IME_NULL) {
attemptLogin()
return@OnEditorActionListener 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;
}
});
到 Kotlin 的一对一转换会给你:
mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{
override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
attemptLogin()
return true
}
})
但是,Kotlin 允许您通过传入 lambda 来使用以 SAM 接口作为参数的方法,语法更简洁。这称为 SAM 转换:
mPasswordView.setOnEditorActionListener { v, actionId, event ->
attemptLogin()
true
}
SAM 转换自动确定此 lambda 对应于哪个接口,但您可以使用称为 SAM 构造函数的东西明确指定它,这就是您的示例代码中的内容。 SAM 构造函数 returns 实现给定接口的对象,并使您传递给它的 lambda 成为其单一方法的实现。
mPasswordView.setOnEditorActionListener( TextView.OnEditorActionListener { v, actionId, event ->
attemptLogin()
true
})
在这种特定情况下这是多余的,因为只有一种方法叫做 setOnEditorActionListener
。但是如果有多个同名的方法,将不同的接口作为参数,您可以使用 SAM 构造函数来指定要调用的方法的重载。
我正在使用这个 Kotlin 函数。我知道我们有一个名为 mPasswordView!!.setOnEditorActionListener
的函数,它接受参数 TextView.OnEditorActionListener
,但它后面的是什么?我们在参数里面有大括号?
mPasswordView!!.setOnEditorActionListener(TextView.OnEditorActionListener { textView, id, keyEvent ->
if (id == R.id.login || id == EditorInfo.IME_NULL) {
attemptLogin()
return@OnEditorActionListener 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;
}
});
到 Kotlin 的一对一转换会给你:
mPasswordView.setOnEditorActionListener(object: TextView.OnEditorActionListener{
override fun onEditorAction(v: TextView?, actionId: Int, event: KeyEvent?): Boolean {
attemptLogin()
return true
}
})
但是,Kotlin 允许您通过传入 lambda 来使用以 SAM 接口作为参数的方法,语法更简洁。这称为 SAM 转换:
mPasswordView.setOnEditorActionListener { v, actionId, event ->
attemptLogin()
true
}
SAM 转换自动确定此 lambda 对应于哪个接口,但您可以使用称为 SAM 构造函数的东西明确指定它,这就是您的示例代码中的内容。 SAM 构造函数 returns 实现给定接口的对象,并使您传递给它的 lambda 成为其单一方法的实现。
mPasswordView.setOnEditorActionListener( TextView.OnEditorActionListener { v, actionId, event ->
attemptLogin()
true
})
在这种特定情况下这是多余的,因为只有一种方法叫做 setOnEditorActionListener
。但是如果有多个同名的方法,将不同的接口作为参数,您可以使用 SAM 构造函数来指定要调用的方法的重载。