На мой взгляд, это похоже на предполагаемое поведение. Хотя в примере короткого кода это не сбивает с толку, если переменная объявлена как 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
}