Почему lateinit работает с типом Object, а не с примитивным типом? - PullRequest
2 голосов
/ 20 апреля 2019

Этот ответ говорит, что типы объектов используют нулевое значение в латинитах типа объекта .Может кто-нибудь уточнить это?Что они подразумевают под «использует нулевое значение»?

Кроме того, он говорит: «Для примитивных типов такого значения не существует» - почему нет

1 Ответ

5 голосов
/ 20 апреля 2019

В JVM, которая исторически была первой платформой, на которую нацелился Котлин, существует различие между примитивными типами и классами, или типами объектов.

Они имеют различные представления времени выполнения: примитивное значение сохраняется непосредственно в поле, которое может содержать только одно из соответствующих значений примитивного типа (например, только true и false для boolean) и имеетнет специального представления для пропущенного значения .Для сравнения, поле с типом класса хранит косвенную ссылку на экземпляр, который расположен где-то в куче, а поле с типом класса может содержать специальную ссылку null, которая не указывает ни на какуюinstance.

Свойства Kotlin lateinit скомпилированы в одно поле, и они внутренне используют значение null, чтобы указать, что свойство еще не было инициализировано.Поскольку поля JVM примитивного типа не могут иметь значение null, Kotlin не допускает lateinit свойств типов, которые обычно отображаются на примитивы Java , так как для этого требуется другое представление, иприемлемого решения не существует, как говорится в другом ответе.

Вместо этого вы можете использовать by Delegates.notNull() для достижения аналогичного поведения с сопоставленными типами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...