Kotlin如何显式指定lambda的实际类型以匹配重载函数参数?
有三种比强制类型转换更优雅且编译期安全的实现方式,其中第二种完全符合你要的类似SAM类型显式指定的简洁写法:
你原有写法无法匹配目标重载的核心原因是编译器会优先匹配参数类型更接近的Context.() -> Unit重载,会导致无限递归,因此需要显式指定lambda类型来匹配返回Boolean的重载。
方案1:使用显式类型的带接收者匿名函数
无需额外类型标注,编译器会自动推导匿名函数的类型,匹配对应重载:@JvmName("use2") fun use(block: Context.() -> Unit) = use( fun Context.(): Boolean { block() return true } )方案2:函数类型构造器(Kotlin 1.4+ 支持,最优解)
和你熟悉的SAM构造写法逻辑完全一致,直接将函数类型当作构造器使用,写法简洁直观:@JvmName("use2") fun use(block: Context.() -> Unit) = use( (Context.() -> Boolean) { block(); true } )方案3:提前声明指定类型的变量存储lambda
通过变量的显式类型标注,引导编译器推导出lambda的正确类型:@JvmName("use2") fun use(block: Context.() -> Unit) { val booleanBlock: Context.() -> Boolean = { block(); true } use(booleanBlock) }
以上三种方案均在编译期完成类型检查,避免了as强转可能带来的运行时类型转换异常。
内容的提问来源于stack exchange,提问作者Jire
相关产品推荐
相关产品推荐

