Kotlin Smartcast 不适用于内联声明

标签 kotlin

对于这些类:

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/

相关文章:

android - 返回后的 kotlin android fragment 空回收器 View

java - 如何将 JUnit 5 与 build.gradle.kts 和 kotlin 一起使用?

java - 更改返回堆栈 Activity 按钮状态

android - Firestore Android 保存失败 - 无法访问 Firestore 后端

kotlin - 我想检查是否引发了异常,但是发生了错误

java - 如何在 Java/Kotlin 中使用新的 StateRestorationPolicy?

android - 如何从 Kotlin 中的设置 Activity 中检索首选项?

android - 如何从 BroadcastReceiver 中的 Workmanager 检查应用程序是否在前台?

java - Java 和 Kotlin 泛型方法的区别

Kotlin 的 when 语句中的正则表达式或通配符?