如何在 Kotlin 中序列化 lambda 函数

9

我想在Kotlin中像Java 8一样对lambda表达式进行序列化,Java 8的操作方式如下:

Runnable r = (Runnable & Serializable)() ->{doSomething();};

但是当我尝试在Kotlin中使用相同的语法时:

val r = { doSomething() } as (Runnable , Serializable)

会出现编译错误:

enter image description here

即使我尝试将Java代码粘贴到Kotlin文件中,也会删除强制类型转换中的Serializable部分。那么,在Kotlin中如何序列化lambda表达式呢?

1个回答

10

Kotlin的lambda表达式默认是可序列化的,详见https://discuss.kotlinlang.org/t/are-closures-serializable/1620

因此以下代码可以正常工作:

 val r = { println("Hallo")} as java.io.Serializable

如果你真的需要一个Runnable,那么这种方法行不通,因为Kotlin只创建了一个Runnable实例:

 val r = Runnable { println("Hallo")} as java.io.Serializable

在这种情况下,您需要显式地创建一个对象:
val r = object: Runnable, java.io.Serializable {
    override fun run() :  Unit {
        println("Hallo")
    }
}

好的,但是如何使用 r 呢?因为它现在是一个变量,当我像这样调用它:btnOk.OnClick{ r } 时,它不会被调用并打印出 "Hallo"。 - Dr.jacky
1
对于第一种解决方案,您需要这样调用:r()。对于第三种解决方案,需要这样调用:r.run() - Rene

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接