В чем разница между Object (Java) и Any (Kotlin)?

Ответ

java.lang.Object и kotlin.Any — корневые супертипы своих иерархий, но с важными семантическими отличиями, обусловленными дизайном Kotlin.

Аспект Object (Java) Any (Kotlin)
Nullability Может содержать null ссылку. Не-nullable по умолчанию. Для nullable-версии используется Any?. Это фундаментальное различие систем типов.
Примитивные типы Примитивы (int, boolean) НЕ являются подтипами Object. Они автоупаковываются в классы-обертки (Integer, Boolean). Все типы, включая неприводимые ("примитивы"), являются подтипами Any. В Kotlin нет разделения на примитивы и объекты на уровне типа.
Методы Предоставляет базовые методы: wait(), notify(), getClass(). Объявляет только equals(), hashCode(), toString(). Методы потоковой синхронизации (wait()) отсутствуют, так как не соответствуют идиомам Kotlin.
Методы-расширения Нет. Имеет множество полезных методов-расширений из стандартной библиотеки: let(), also(), takeIf(), toString() с default-аргументом.

Пример, иллюстрирующий разницу:

// Kotlin
val list: List<Any> = listOf(42, "text", true) // Int, String, Boolean — все Any
val nullable: Any? = null // Явно nullable

// Методы-расширения
val result = "Kotlin".let { it.length > 3 }.also { println(it) } // true

Вывод: Any — это более современный и согласованный корневой тип, интегрированный с системой null-safety Kotlin и его стандартной библиотекой.

Ответ 18+ 🔞

А, ну это же классика, блядь! Сидишь такой, переходишь с Java на Kotlin, и тут — бац! — вместо старого доброго Object тебе подсовывают какого-то Any. И думаешь: «Да хули, одно и то же, просто переименовали». Ан нет, ёпта, не тут-то было! Разница — овердохуища, и сейчас я тебе её на пальцах, как Герасим Муму, объясню, только топить никого не будем.

Смотри, в чём корень зла, то есть дизайна. В Java Object — это как дед-алкаш на лавочке у подъезда: всё может принять, даже пустую бутылку (null), а примитивы типа int к нему в родню не идут — они сначала должны в коробочку (Integer) запаковаться, стыдливо так.

А Kotlin взял и сказал: «Да похуй на это разделение, блядь!». И сделал Any таким универсальным папой для ВСЕХ типов. Int, String, Boolean — все его дети, все подтипы. И главное, блядь, по умолчанию он нихуя не nullable! Хочешь запихнуть null? Пожалуйста, но будь добр, явно укажи Any?. Это как поставить на стол две тарелки: одна для еды (Any), другая для того, чтобы в неё плюнуть и сказать «фу» (Any?). Порядок, сука!

А методы! О, это отдельная песня. В Java Object — это такой старый сисадмин с ключами от всех серверов: у него есть wait(), notify(), getClass(). В Kotlin на это посмотрели и решили: «Не, это не наши идиомы, это какое-то шаманство с потоками». Поэтому в Any оставили только святое трио: equals(), hashCode(), toString(). Всё. Чисто, аскетично.

Но зато, блядь, какой роскошный приквел! Kotlin навешал на Any кучу методов-расширений. Это как если бы к тому деду на лавочке приставили личного ассистента, который ему и пиво подаст, и очки протрёт. let(), also(), takeIf() — это всё его рук дело. Красота, ядрёна вошь!

Вот смотри, как это в коде выглядит, пиздец как элегантно:

// Kotlin
val list: List<Any> = listOf(42, "text", true) // Смотри-ка, Int, String, Boolean — и все спокойно в одном списке как Any. Никаких коробочек!
val nullable: Any? = null // А вот если хочешь null — получи явно, подпишись, блядь.

// И вот эта магия с методами-расширениями, в рот меня чих-пых!
val result = "Kotlin".let { it.length > 3 }.also { println(it) } // Берёт, делает дело, и ещё побочный эффект красиво в консоль кладёт. true, нахуй!

Короче, вывод, блядь: Any — это не просто переименованный Object. Это его прокачанная, отполированная и трезвая версия, которая вписалась в новую систему null-safety и притащила с собой целую свиту полезных утилит. Переход с Java на Kotlin — это как поменять Запорожец на нормальную машину: руль тоже круглый, но едет-то по-другому, ёбта!