【问题标题】:Does Kotlin permit extension methods on lambdas?Kotlin 是否允许在 lambdas 上使用扩展方法?
【发布时间】:2018-12-29 18:44:09
【问题描述】:

我正在尝试为实例化抽象类创建一个很好的类似 SAM 的 API,因为我不喜欢对象表达式。我正在尝试做类似的事情:

{my lambda code here}.my_extension_function()

Kotlin 可以做到吗?

【问题讨论】:

  • 你不能实例化抽象类:p
  • 注意:仅仅因为你可以做到这一点(根据谢尔盖的回答),并不意味着这是一个好主意。一方面,它可能会使大多数阅读您的代码的人感到困惑;并且(根据 Sergey 提到的分号问题)它可能会产生一些意想不到的效果。

标签: kotlin kotlin-extension


【解决方案1】:

是的,这是可能的。示例代码为:

// extension function on lambda with generic parameter
fun <T> ((T) -> Unit).my_extension_function() {
    // ...
}

// extension function on lambda without generic parameter
fun (() -> Unit).my_extension_function() {
    // ...
}

并使用它,例如,像这样:

// lambda variable with generic parameter
val lambda: (Int) -> Unit = {
    // 'it' contains Int value
    //...
}

// lambda variable without generic parameter
val lambda: () -> Unit = {
    //...
}

lambda.my_extension_function()

// also we can call extension function on lambda without generic parameter like this
{
    //...
}.my_extension_function()

// or with generic parameter
{ i: Int ->
        //...
}.my_extension_function()

注意:如果你在lambda上调用扩展函数而不创建变量,并且在它之前有一个函数调用,你需要在函数调用之后添加分号,例如:

someFunction();

{
    //...
}.my_extension_function()

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多