Kotlin when表达式中Smart Cast智能转换不生效问题咨询
Kotlin if与when结构智能转换差异说明
核心原因
两种写法看似逻辑等价,但Kotlin编译器的智能转换条件追踪逻辑存在明确差异:
- 对于
if (address?.person != null)的写法:编译器会直接将address?.person != null的判断结果和变量状态绑定,在if的true分支内会自动追踪到两个约束信息:address本身非空、address.person属性非空,因此可以触发智能转换,直接访问address.person.name无需额外判空。 - 对于
when (address?.person != null)的写法:when的入参是布尔表达式address?.person != null的计算结果,编译器只会知道进入true分支时这个布尔值为真,不会反向推导这个布尔值对应的变量状态约束,因此无法确认address和address.person的非空性,智能转换失效,编译报错。
该规则和Kotlin版本无关,所有稳定版本的Kotlin都遵循该智能转换逻辑。
修复方案
方案1:将要判断的对象直接作为when的参数
利用分支匹配做非空判断,可直接触发智能转换:
fun getPersonFromAddress(address: Address?): String { return when (address?.person) { null -> "Not found" else -> it.name } }
方案2:使用无参when结构
将判断条件直接写到分支中,这种写法和if-else完全等价,可正常触发智能转换:
fun getPersonFromAddress(address: Address?): String { return when { address?.person != null -> address.person.name else -> "Not found" } }
内容的提问来源于stack exchange,提问作者sandrozbinden
相关产品推荐
相关产品推荐

