当 kotlin lambda 有效地转换为 java SAM 时?



考虑这段代码

爪哇端:

public class Executor {
public void execute (Runnable runner) { /* do something with runner */ }
}

科特林方面:

val executor = Executor() 
var runner: () -> Unit = { } // expected Runnable
executor.execute(runner)

SAM 转换是在变量声明行var runner: () -> Unit = {}还是在execute()函数中完成?

执行范围内的runner引用是否与runner声明不同?

转换发生在调用站点,即实际需要Runnable时。看看编译器正在生成什么(用 Java 代码表示):

final class FileKt$sam$Runnable$9c7e667b implements Runnable {
private final Function0 function;
FileKt$sam$Runnable$9c7e667b(Function0 var1) {
this.function = var1;
}
public final void run() {
Intrinsics.checkExpressionValueIsNotNull(this.function.invoke(), "invoke(...)");
}
}

上面的代码显示,Runnable的实现是由编译器生成的,编译器将Function作为其构造参数。 在run实现中,该函数只是被调用。

//the call
Executor executor = new Executor();
Function0 runner = (Function0)null.INSTANCE;
Object var10001 = runner;
if (runner != null) {
var10001 = new FileKt$sam$Runnable$9c7e667b(runner);
}
executor.execute((Runnable)var10001);

调用端显示编译为Function对象的 lambda 如何转换为正确的Runnable实例。

最新更新