gpt4 book ai didi

Kotlin Smartcast 不适用于内联声明

转载 作者:行者123 更新时间:2023-12-01 22:07:12 26 4
gpt4 key购买 nike

对于这些类:

open class User

class Admin(val name: String) : User()


编译:

fun main1() {
val user: User
user = Admin("John")
user.name
}

这不会编译:

fun main2() {
val user: User = Admin("John")
user.name // "Unresolved reference: name"
}


唯一的区别是声明和初始化是否分开。为什么编译器在第一个场景中允许将 user 智能转换为 Admin,但在第二个场景中不允许?

最佳答案

在我看来,这看起来像是预期的行为。虽然在简短的代码示例中这并不令人困惑,但如果变量被声明为 User ,则意味着正在使用该类,而不是其后代之一。

在第一个示例中,智能转换在函数范围内工作。其次,它甚至不尝试评估分配的类型,因为字段已经明确键入。

考虑以下示例来直观地了解 main1 编译的原因:

fun main(){
val user : User
if(condition) {
user = Admin("Jon")
user.name // smart cast to "Admin" within if branch scope
} else {
user = User()
}
user.name // unresolved
}

关于Kotlin Smartcast 不适用于内联声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58531157/

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