Kotlin扩展函数中Contracts空值检查失效,智能类型转换不生效
解决扩展函数的智能类型转换问题
问题出在扩展函数的合约中对接收器的引用方式。将合约里的this@isValidID替换为this,就能让编译器正确识别返回true时接收器非空的约束,从而实现智能类型转换。
修正后的扩展函数代码:
fun test() { val id: Long? = 5L if (id.isValidID()) { // 现在可以正常编译,id被智能转换为Long类型 doWithId(id) } } fun doWithId(id: Long) {} @OptIn(ExperimentalContracts::class) fun Long?.isValidID(): Boolean { contract { returns(true) implies (this != null) } return this != null && this != 0L }
原因说明
在扩展函数的合约块中,this直接指代扩展函数的接收器对象。使用this@isValidID虽然语法合法,但编译器的合约分析器无法正确将其关联到调用处的变量(如示例中的id),导致无法触发智能类型转换。而直接使用this能让编译器清晰识别约束条件,从而在函数返回true时自动将接收器的类型从Long?转换为Long。
内容的提问来源于stack exchange,提问作者rexar5
相关产品推荐
相关产品推荐

