Следующий код в котлин:
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.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
в Котлине.
"Any"
является аналогом java.lang.Object
: суперкласса всех классов в Котлине.