gpt4 book ai didi

kotlin - 如何在 Kotlin 中将功能接口(interface)实现为 lambda?

转载 作者:行者123 更新时间:2023-12-02 12:14:34 27 4
gpt4 key购买 nike

我想将功能性 kotlin 接口(interface)(与单个抽象方法的接口(interface))实现为 kotlin lambda。怎么做?

Kotlin 接口(interface)

@FunctionalInterface
interface Foo{
fun bar(input: String): String
}

Kotlin 实现 .
fun createFoo(): Foo {
return { input: String -> "Hello $input!" }
}

↑ 不编译 ↑

它必须被实现为对象,这很难看。
fun createFoo() = 
object : Foo{
override fun bar(input: String)= "Hello $input"
}

编辑:将我的示例界面从 java 更正为 kotlin

最佳答案

从 Kotlin v1.4 开始

SAM 转换将在 1.4 版中得到支持,并带有一种新的类型推断算法。

看:

  • What to Expect in Kotlin 1.4 and Beyond
  • More powerful type inference algorithm


  • Kotlin v1.4 之前

    如果伴随对象实现 invoke函数采用 lambda。

    Kotlin 接口(interface)
    interface Foo{
    fun bar(input: String): String

    companion object {
    inline operator fun invoke(crossinline function: (String) -> String) =
    object : Foo{
    override fun bar(input: String) = function(input)
    }
    }
    }

    Kotlin 实现
    fun createFoo()= Foo { input: String -> "Hello $input!" }

    kotlin 中定义的函数式/SAM 接口(interface)无法通过设计实现为 Kotlin lambda,请参阅 KT-7770 .

    在 Kotlin 中,函数式/SAM 接口(interface)被视为反模式,应改为声明函数类型: (String)->String .函数类型可以表示为 typealias 以使其看起来和感觉像一个接口(interface): typealias Foo=(String)->String .

    注意:typealias 仅在 Kotlin 中的 Java 代码中不可见!

    关于kotlin - 如何在 Kotlin 中将功能接口(interface)实现为 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58713623/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com