Любой объект ==

Следующий код в котлин:

Any().javaClass

Имеет значение java.lang.Object. Означает ли это, что Any и Object являются одним и тем же классом? Каковы их отношения?

Ответы

Ответ 1

Нет.

Из документов Котлина (Emphasis mine)

Все классы в Котлин имеют общий суперкласс Any, что это супер по умолчанию для класса без каких - либо супертипов заявил:

class Example//Implicitly inherits from Any

Any не является java.lang.Object; в частности, он не имеет никаких элементов, кроме equals(), hashCode() и toString(). Для получения более подробной информации обратитесь к разделу совместимости Java.

Далее, из раздела о отображаемых типах мы находим:

Kotlin рассматривает некоторые типы Java специально. Такие типы не загружаются из Java "как есть", а отображаются на соответствующие типы Kotlin. Отображение имеет значение только во время компиляции, представление во время выполнения остается неизменным. Типы примитивов Javas сопоставляются соответствующим типам Kotlin (учитывая типы платформ):

...

java.lang.Object kotlin.Any!

Это говорит о том, что во время выполнения java.lang.Object и kotlin.Any! обрабатываются одинаково. Но ! также означает, что тип является типом платформы, что имеет значение в отношении отключения нулевых проверок и т.д.

Любая ссылка в Java может быть нулевой, что делает требования Котлинса о строгой нулевой безопасности нецелесообразными для объектов, поступающих с Java. Типы объявлений Java обрабатываются специально в Kotlin и называются типами платформ. Null-чеки смягчены для таких типов, так что гарантии безопасности для них такие же, как в Java (см. Ниже).

...

Когда мы вызываем методы для переменных типов платформ, Kotlin не выдает ошибок с ошибкой при компиляции, но вызов может завершиться неудачно во время выполнения из-за исключения с нулевым указателем или утверждения, которое генерирует Kotlin для предотвращения распространения NULL:

Ответ 2

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

javaClass возвращает класс выполнения экземпляра, поэтому вы получаете тот же класс java.lang.Object в обоих случаях.

Существуют также другие типы, которые отличаются во время компиляции, но то же самое во время выполнения; они перечислены в разделе Mapped types документации.

Ответ 3

На самом деле, нет java.lang.Object в аспекте Kotlin lang, поэтому вы, конечно, не можете сказать Any is Object. Вы можете только сказать, что Any заменяет Object в Котлине.

Ответ 4

"Any" является аналогом java.lang.Object: суперкласса всех классов в Котлине.