【问题标题】:How to make Kotlin lambda to work in generics class如何使 Kotlin lambda 在泛型类中工作
【发布时间】:2021-03-05 04:14:04
【问题描述】:

我正在将我的 signals 库从 Java 转换为 Kotlin,但我无法让 Kotlin 与 lambda 表达式配合使用。

这是图书馆的样子:

object Signals{

   fun <T : Any> inject(type: KClass<T>): Signal<T> {
      
   }
}

class Signal<T : Any>{
      fun addListener(listener: T){
      }
}

现在我想注入 TestMe 接口。

interface TestMe{
    fun onTest(message:String)
}

@Test
fun inject() {
    val testMeSignal = Signals.inject(TestMe::class)
    testMeSignal.addListener(...)     
}

我希望它使用 lambda 作为休闲:

    testMeSignal.addListener({s:String-> println(s)})

但唯一有效的是

    testMeSignal.addListener(object: TestMe{
        override fun onTest(s: String) {
            println(s)
        }
    })

如何让 lambda 在这里工作?

【问题讨论】:

标签: kotlin lambda


【解决方案1】:

在我看来,它正在按预期工作。

您的addListener 需要一个实现TestMe 的类的实例。所以你需要创建一个扩展TestMe 的对象来实现所有需要的功能。

如果您将 lambda 作为参数传递,它将不是您的类的实现。

不确定你打算做什么,但也许你想要一个函数来定义预期的 lambda 类型?

fun myFun(f: (String) -> Unit)

在您的情况下,object: TestMe 看起来是正确的解决方案。

【讨论】:

    【解决方案2】:

    为了能够使用 SAM 转换,您可以将 TestMe 声明为 fun interface

    fun interface TestMe{
        fun onTest(message:String)
    }
    

    然后你可以使用:

    testMeSignal.addListener { s: String ->
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      相关资源
      最近更新 更多