На этом шаге мы поговорим о классе Any.
Все классы в Kotlin наследуют общий суперкласс, известный как Any, без необходимости явного указания на это в вашем коде (рисунок 1).
Рис.1. Иерархия типов TownSquare
Например, и Room, и Player являются косвенными потомками Any. Вот почему можно объявлять функции, которые будут принимать экземпляры любого из этих типов в качестве аргументов. В этом Kotlin напоминает Java, где все классы неявно наследуют класс java.lang.object.
Рассмотрим следующий пример функции с именем printIsSourceOfBlesings().
Эта функция принимает аргумент типа Any и использует условный оператор для проверки типа переданного аргумента. В конце она выводит результаты проверки. Здесь используется несколько новых идей, которые мы рассмотрим чуть позже.
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") }
В NyetHack есть только два источника благословения: благословленный игрок или комната с названием Fount of Blessings.
Так как каждый объект - это подкласс Any, можно передавать аргументы любого типа в printIsSourceOfBlesings(). Такая гибкость полезна, но иногда она не позволяет сразу же начать работу с аргументом. Этот пример использует приведение типа, чтобы справиться с ненадежным аргументом Any.
На следующем шаге мы рассмотрим приведение типа.