首页 > 解决方案 > Kotlin:如何明确指定 lambda 的实际类型?

问题描述

如何在 Kotlin 中明确指定 lambda 的实际类型?

这是必要的,因为如果我有两个采用相似 lambda 的函数,例如

fun use(block: Context.() -> Boolean)
@JvmName("use2") fun use(block: Context.() -> Unit)

我希望能够use2拨打常规 (Boolean) 电话use,即

@JvmName("use2") fun use(block: Context.() -> Unit) = use { block(); true }

这类似于您如何显式指定 SAM 类型,例如:

Runnable { println("hello") }

我怎样才能对 Kotlin lambda 类型做同样的事情?

这是我提出的如何解决问题的解决方案,但我想知道是否有更好/更清洁的方法。

@JvmName("use2") fun use(block: Context.() -> Unit) = use({ block(); true } as (Context.() -> Boolean)})

标签: javafunctionkotlinlambdatypes

解决方案


我已经使它与此一起使用:

@JvmName("use2") fun use(block: Context.() -> Unit) =
    use({ foo: Context -> block(foo); true } as (Context) -> Boolean)

删除强制转换或: String类型注释将使其无法编译。IntelliJ IDEA 还错误地报告了强制转换是不必要的(请注意,这不是 IntelliJ 第一次出错

请注意,我已将 lambda 的类型从 更改Context.() -> Boolean(Context) -> Boolean,因为我认为没有办法明确指定接收器类型。不过,这不会影响重载决议。

如果你真的想使用接收器类型为 的东西Context,你可以使用匿名函数:

@JvmName("use2") fun use(block: Context.() -> Unit) =
    use(fun Context.(): Boolean { block(); return true })

我认为这是一种更好的编写方式use2,但请注意匿名函数在许多方面与 lambda 不同。


推荐阅读