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

Kotlin安全调用运算符疑问:为何部分场景无法直接使用.调用?

Kotlin空安全调用疑问解答

第2行reversed()前用?.的原因

虽然takeLast()本身返回非空的String,但它的调用表达式userName?.takeLast(2)的整体类型是String?。因为userName是可空的String?,当userName为null时,userName?.takeLast(2)会直接返回null,不会执行takeLast()方法。

这意味着这个表达式的结果可能是String(userName非空时),也可能是null(userName为空时)。所以后续调用reversed()必须用安全调用?.,否则如果userName是null,直接用.会触发空指针异常,编译器也会报错。

第3行第二个plus()的误区

这里要明确:第3行的代码存在编译错误,无法正常运行。

userName?.plus("kotlin")的类型是String?——当userName为null时,这个表达式返回null。而null属于Any?类型,并没有plus()方法,直接在后面用.plus("lang")会导致编译器报错。

正确的写法应该是延续安全调用链:userName?.plus("kotlin")?.plus("lang"),或者用Elvis运算符提前处理null情况,比如(userName?.plus("kotlin") ?: "").plus("lang")。

你觉得第二个plus()无需Elvis运算符,其实是忽略了userName?.plus("kotlin")的可空性——它的结果仍然是可空类型,直接调用普通方法是不允许的。

内容的提问来源于stack exchange,提问作者Dmitry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:52:40