【问题标题】:How to serialize a lambda in kotlin如何在 kotlin 中序列化 lambda
【发布时间】:2019-03-10 12:21:23
【问题描述】:

我正在尝试像在 java 8 中那样序列化一个 lambda,其执行方式如下:

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

但是当它像这样在 kotlin 中尝试同样的事情时:

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

我得到一个编译错误:

即使我尝试将 java 代码粘贴到 kotlin 文件中,它也会删除演员表的可序列化部分。因此如何在 kotlin 中序列化 lambda?

【问题讨论】:

    标签: lambda kotlin


    【解决方案1】:

    默认情况下 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”。
    • 对于第一个解决方案,您必须像这样调用:r()。对于这样的第三个解决方案:r.run()
    猜你喜欢
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    相关资源
    最近更新 更多