Следующий код в котлин:
Any().javaClass
Имеет значение java.lang.Object. Означает ли это, что Any и Object являются одним и тем же классом? Каковы их отношения?
Следующий код в котлин:
Any().javaClass
Имеет значение java.lang.Object. Означает ли это, что Any и Object являются одним и тем же классом? Каковы их отношения?
Нет.
Из документов Котлина (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.Objectkotlin.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 в Котлине.
"Any" является аналогом java.lang.Object: суперкласса всех классов в Котлине.