gpt4 book ai didi

kotlin - 在 Kotlin 中使用安全调用运算符对相似代码产生不同结果

转载 作者:行者123 更新时间:2023-12-05 01:23:00 25 4
gpt4 key购买 nike

我是 Kotlin 的新手,下面这两个代码给出了不同的结果。

fun main() {
var name: String? = "Rajat"
name = null
print(name?.toLowerCase())
}

输出:Compilation Error(非法访问操作)

fun main() {
var name: String? = null
print(name?.toLowerCase())
}

输出:空

最佳答案

当你做这个作业时:

name = null

name 被智能转换为 Nothing?,这是有问题的。 Nothing 是每种类型的子类型,因此您可以根据重载解析规则调用任何类型的任何可访问扩展函数 here .

比较:

fun main() {
var name: String? = "Denis"
name = null
print(name?.myExtension()) // works

val nothing: Nothing? = null
print(nothing?.myExtension()) // also works
}

fun Int.myExtension(): Nothing = TODO()

请注意,允许您在 Nothing 上调用任何扩展函数是绝对安全的 - name 无论如何都是 null,所以 实际上 没有调用任何东西。

Char.toLowerCaseString.toLowerCase 恰好是两个可访问的扩展函数,您可以在 name 上调用它们,现在是 Nothing?。因此,调用是不明确的。

请注意,智能转换仅发生在赋值中,而不发生在像 var name: String? = 空。因此,在这种情况下,name 不是智能转换为 Nothing?:

fun main() {
var name: String? = null
print(name?.toLowerCase()) // better to use lowercase(), toLowerCase is deprecated!
}

原因参见my answer here .

关于kotlin - 在 Kotlin 中使用安全调用运算符对相似代码产生不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73018920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com