Почему Котлин не позволяет использовать lateinit с примитивными типами?

На языке Котлин мы по умолчанию должны инициализировать каждую переменную, когда она введена. Чтобы этого избежать, можно использовать ключевое слово lateinit . Ссылаясь на переменную lateinit до того, как она была инициализирована, вы lateinit исключение во время выполнения.

lateinit не может использоваться с примитивными типами. Почему это так?

    Для типов объектов Kotlin использует null значение, чтобы отметить, что свойство lateinit не было инициализировано и выбросить соответствующее исключение при доступе к свойству.

    Для примитивных типов такого значения нет, поэтому нет возможности пометить свойство как неинициализированное и предоставить диагностику, lateinit необходимо предоставить. (Мы могли бы попытаться использовать какой-то отдельный маркер, но этот маркер не обновлялся при инициализации поля через отражение, что является основным прецедентом lateinit ).

    Поэтому lateinit поддерживается только для свойств объектов.

    Короткий ответ заключается в том, что с примитивами вы всегда можете использовать 0 в качестве значения по умолчанию и с null типами null по умолчанию. Для нестандартных типов lateinit типов может потребоваться использовать lateinit для работы с системой безопасности типа.

    На самом деле нет необходимости инициализировать переменную в Kotlin, если она имеет значение перед первым доступом и может быть статически доказана. Это означает, что этот код совершенно верен:

     fun main(args: Array<String>) { var x: Int val y: Double x = 0 y = x + 0.1 println("$x, $y") } 

    Но есть (редкие) случаи, когда инициализация не может быть статически доказана. Наиболее распространенным случаем является поле класса, которое использует любую форму инъекции зависимостей:

     class Window { @Inject lateinit parent: Parent }