Как работают примитивы в Kotlin

В Kotlin примитивные типы данных (например, Int, Double, Boolean и другие) представлены как объекты, что обеспечивает удобство и безопасность языка. Однако под капотом Kotlin использует примитивные типы JVM для оптимизации производительности. Рассмотрим подробнее, как это работает:

Основные примитивные типы в Kotlin

  • Целочисленные типы:

    • Byte (8 бит)
    • Short (16 бит)
    • Int (32 бита)
    • Long (64 бита)
  • Вещественные типы:

    • Float (32 бита)
    • Double (64 бита)
  • Символьный тип:

    • Char (16 бит)
  • Логический тип:

    • Boolean (представляет true или false)

Объектная природа типов

В Kotlin все типы являются объектами, что позволяет использовать их как объекты класса. Например, Int в Kotlin — это не примитивный тип, а класс kotlin.Int. Однако, для повышения производительности, компилятор Kotlin оптимизирует использование примитивных типов JVM там, где это возможно.

Оптимизация под JVM

При компиляции Kotlin-кода в байт-код JVM компилятор старается использовать примитивные типы JVM (int, double, boolean и т.д.) вместо их объектных оберток (Integer, Double, Boolean и т.д.). Это позволяет избежать накладных расходов на создание объектов и повышает производительность.

fun add(a: Int, b: Int): Int {
    return a + b
}

В данном случае, при компиляции в байт-код JVM будет использован примитивный тип int для параметров и возвращаемого значения, что обеспечивает эффективное выполнение операции сложения.

Автоупаковка и автораспаковка

Когда требуется использовать объектные типы (например, при работе с коллекциями, которые не поддерживают примитивные типы), Kotlin автоматически выполняет упаковку (boxing) и распаковку (unboxing) примитивных типов.

val list: List<Int> = listOf(1, 2, 3)

Здесь числа 1, 2, 3 автоматически упаковываются в объекты Integer для хранения в списке. Почему в коллекциях не используются примитивные типы

Nullable типы

Если тип данных объявлен как nullable (например, Int?), то он всегда представлен объектом, даже если исходный тип является примитивным. Это связано с тем, что примитивные типы не могут быть null.

val number: Int? = null