Kotlin Smartcast не работает для встроенного объявления - PullRequest
4 голосов
/ 24 октября 2019

Для этих классов:

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 в первом сценарии, но не во втором сценарии?

1 Ответ

1 голос
/ 24 октября 2019

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