В JVM, которая исторически была первой платформой, на которую нацелился Котлин, существует различие между примитивными типами и классами, или типами объектов.
Они имеют различные представления времени выполнения: примитивное значение сохраняется непосредственно в поле, которое может содержать только одно из соответствующих значений примитивного типа (например, только true
и false
для boolean
) и имеетнет специального представления для пропущенного значения .Для сравнения, поле с типом класса хранит косвенную ссылку на экземпляр, который расположен где-то в куче, а поле с типом класса может содержать специальную ссылку null
, которая не указывает ни на какуюinstance.
Свойства Kotlin lateinit
скомпилированы в одно поле, и они внутренне используют значение null
, чтобы указать, что свойство еще не было инициализировано.Поскольку поля JVM примитивного типа не могут иметь значение null
, Kotlin не допускает lateinit
свойств типов, которые обычно отображаются на примитивы Java , так как для этого требуется другое представление, иприемлемого решения не существует, как говорится в другом ответе.
Вместо этого вы можете использовать by Delegates.notNull()
для достижения аналогичного поведения с сопоставленными типами.