На этом шаге мы рассмотрим особенности реализации вывода в этом классе.
При выводе значения переменной в консоль, вызывается функция с именем toString(), чтобы определить, как значение выглядит в консоли. Для некоторых типов это просто: например, значение строки выражается через значение String. Но для других типов это не так очевидно.
Класс Any включает абстрактные определения функций вроде toString(), которые поддерживаются целевой платформой, где выполняется проект.
Заглянув в исходный код класса Any, можно увидеть следующее:
/** * Корень иерархии классов в Kotlin. * Все классы в Kotlin наследуют суперкласс [Any]. */ public open class Any { public open operator fun equals(other: Any?): Boolean public open fun hashCode(): Int public open fun toString(): String } //
Обратите внимание, что функция toString() отсутствует в объявлении класса. Но где она тогда находится и что возвращает, когда вызывается, например, для экземпляра Player?
Вспомните последнюю строку в 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") }
Результат вызова printIsSourceOfBlesings(), в случае передачи ей благословленного игрока, выглядит примерно так:
Player@71efa55d is a source of blessings: true
Player@71efa55d - это результат реализации toString() по умолчанию в классе Any. Kotlin использует реализацию java.lang.Object.toString() из JVM, потому что для компиляции вы выбрали JVM. Вы можете переопределить toString() в вашем классе Player, чтобы возвращать что-то более удобочитаемое.
Тип Any - это один из способов для Kotlin оставаться платформонезависимым. Он служит абстракцией, представляющей типичный суперкласс для каждой конкретной платформы, такой как JVM. То есть когда целевой платформой является JVM, для toString() в Any выбирается реализация java.lang.Object.toString(), но при компиляции в JavaScript ее реализация будет отличаться. Это отвлеченное объяснение означает, что вам не надо знать особенности каждой системы, в которой вы будете запускать свой код. Вместо этого можно просто положиться на тип Any.
Со следующего шага мы начнем рассматривать объекты.