java - 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)})
解决方案
我已经使它与此一起使用:
@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 不同。
推荐阅读
- reactjs - UNSAFE_componentWillReceiveProps 总是触发每个输入值的变化
- video - 使用 ffmpeg 将视频分割成片段
- android - Android Studio:无法运行仿真
- c# - AutoMapper 8.0 ConstructUsing 使用重大更改
- sql - 种子方法在编辑后不会第二次更新数据库。该怎么办?
- c# - 通过 tcp 网络发送数据包
- c# - 可以将面板中的绘图传递给另一种形式的图片框吗?
- c# - 绘制模型时,nearClipPlane 和 farClipPlane 的作用是什么?
- r - bsts 后验分布
- ms-access - 计算不同记录的字段持续时间