You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:45:00