Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当kotlin lambda有效地转换为java SAM时?_Lambda_Kotlin - Fatal编程技术网

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

当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

考虑到这段代码

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 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);