Шаг 172.
Основы Kotlin.
Наследование. Умное приведение типа

    На этом шаге мы рассмотрим умное приведение.

    Один из способов убедиться в успехе приведения типа заключается в том, чтобы предварительно проверить тип приводимой переменной. Вернемся к первой ветви условного оператора в printIsSourceOfBlesings():

fun printIsSourceOfBlessings(any: Any) {
    val isSourceOfBlessings = if (any is Player) {
        any.isBlessed
    } else {
        (any as Room).name == "Fount of Blessings"
    }
    println("$any is a source of blessings: $isSourceOfBlessings")
}

    Согласно условию, чтобы выполнилась эта ветвь, аргумент any должен иметь тип Player. Внутри ветви код ссылается на свойство isBlessed экземпляра any. isBlessed - это свойство класса в Player, а не Any, как же возможно такое обращение без приведения типа?

    На самом деле здесь выполняется приведение - умное приведение.

    Компилятор Kotlin достаточно умен, чтобы определить, что если проверка типа any is Player в условном операторе выполнилась успешно, то внутри ветви any можно считать экземпляром Player. Зная, что в этой ветви приведение any к Player всегда будет успешным, компилятор позволяет отбросить синтаксис приведения и просто сослаться на isBlessed-свойство класса Player.

    Умное приведение типа - это пример того, как интеллект компилятора Kotlin позволяет использовать более лаконичный синтаксис.

    В рассмотренных шагах мы увидели, как создавать подклассы, обладающие общими чертами. В дальнейшем вы познакомитесь с другими типами классов, включая классы данных, перечисления и object (класс с одним экземпляром), когда будете добавлять цикл игры в NyetHack.

    На следующем шаге мы еще вернемся к классу Any.




Предыдущий шаг Содержание Следующий шаг