您示例中使用的功能是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構造函數指定要調用的方法的哪個重載。
Official docs about SAM conversions
好吧,我的錯誤。這不是一個功能...... –