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
相关产品推荐
相关产品推荐

