我是 kotlin 的新手,我正在嘗試開發一個 gradle 插件。當我實作一個名為org.gradle.api.Action.
我的代碼。
val action: Action<AppliedPlugin> = Action { // Tip from IDEA "this:AppliedPlugin"
}
Java中的函式介面。
public interface Action<T> {
/**
* Performs this action against the given object.
*
* @param t The object to perform the action on.
*/
void execute(T t);
}
我對提示感到困惑,因為我認為引數的默認名稱it不是this.
然后我宣告了另一個Java函式介面并實作了它。這次小費是it:AppliedPlugin!。這是我的代碼和臨時函式介面。
val temp: Temp<AppliedPlugin> = Temp { // Tip from IDEA "it:AppliedPlugin!"
}
public interface Temp<T> {
void test(T t);
}
有人可以解釋為什么 kotlinthis在第一個 lambda 中用作默認引數名稱嗎?
uj5u.com熱心網友回復:
請注意,根據其檔案org.gradle.api.Action<T>,標有。的效果正是你可以參考 lambda 引數使用(大部分時間可以省略):@HasImplicitReceiverHasImplicitReceiverthis
將 SAM 介面標記為 lambda 運算式/閉包的目標,其中單個引數作為呼叫的隱式接收器(
this在 Kotlin 中,delegate在 Groovy 中)傳遞,就好像 lambda 運算式是引數型別的擴展方法一樣。
這有點像在 Kotlin 中撰寫,從某種意義上說this是 lambda 引數。
fun interface Action<T> {
fun T.execute()
}
但是上面的并不完全一樣,因為你只能execute在很少的地方呼叫,不像Java版本。
這在撰寫 gradle 插件時很有用,因為必須it.在 build.gradle 中的任何地方都鍵入不是很好。
請注意,這是 Gradle API 特有的。一般來說,在 Kotlin 中,您將無法做這樣的事情。如果您有這樣的 SAM 介面:
public interface Action<T> {
void execute(T t);
}
lambda 引數始終為it,或您提供的其他名稱。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/490141.html
