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

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

Any().javaClass 

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

Нет.

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

Все классы в Kotlin имеют общий суперкласс All, который является суперполе по умолчанию для класса без объявленных супертипов:

class Example // Implicitly inherits from Any

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

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

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

java.lang.Object kotlin.Any!

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

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

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

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

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

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

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

Intereting Posts