На этом шаге мы рассмотрим умное приведение.
Один из способов убедиться в успехе приведения типа заключается в том, чтобы предварительно проверить тип приводимой переменной. Вернемся к первой ветви условного оператора в 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.