对于这些课程:
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
,而在第二种情况下不允许编译器?
答案 0 :(得分:1)
在我看来,这看起来像是预期的行为。在简短的代码示例中,这并不会造成混淆,但是,如果将变量声明为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
}