当kotlin lambda有效地转换为java SAM时?
考虑到这段代码 java方面:当kotlin lambda有效地转换为java SAM时?,lambda,kotlin,Lambda,Kotlin,考虑到这段代码 java方面: 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 r
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代码表示):
上面的代码显示,Runnable
的实现是由编译器生成的,它将函数
作为其构造参数。在运行
实现中,只需调用该函数
//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);
调用端显示编译为函数
对象的lambda如何转换为适当的可运行
实例
//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);