Kotlin Smartcast不适用于嵌入式声明

李三乐

对于这些课程:

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"
}


唯一的区别是是否拆分声明和初始化。为什么在第一种情况下不允许编译器智能广播userAdmin第二种情况下?

帕维尔

我认为这看起来像是预期的行为。虽然在简短的代码示例中这并不会造成混淆,但是如果声明变量,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
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章