Android Studio: уроки на Kotlin. Типы данных.

Любое приложение оперирует данными: числа, текст, флаги «да/нет». Прежде чем писать сложные экраны, важно разобраться, какие типы данных существуют в Kotlin и как с ними работать. В этом уроке из цикла Android Studio: уроки на Kotlin мы познакомимся с базовыми типами, научимся объявлять переменные, преобразовывать значения и избегать типичных ошибок новичка.


Главное отличие Kotlin: здесь нет примитивов

Разработчики, пришедшие из Java, часто ищут примитивные типы в Kotlin. Секрет в том, что на уровне языка их не существует — каждый тип является объектом. Компилятор Kotlin сам решает, когда можно скомпилировать объект в JVM-примитив для экономии памяти, а когда оставить ссылочным. Для вас это означает единообразный синтаксис и отсутствие путаницы между int и Integer.


Числа: целые и с плавающей точкой

Целочисленные типы различаются разрядностью, и выбор зависит от того, какой диапазон значений вам нужен:

  • Byte (8 бит): от -128 до 127. Применяется для сырых байтовых данных или флагов.
  • Short (16 бит): от -32768 до 32767. Редкий гость в Android-коде, но встречается при работе с аудиопотоками.
  • Int (32 бита): от -2³¹ до 2³¹-1. Стандартный целочисленный тип в Kotlin. Если вы пишете просто val age = 25, компилятор выводит именно Int.
  • Long (64 бита): от -2⁶³ до 2⁶³-1. Используйте, когда Int не хватает — например, для идентификаторов или временных меток. Обязательно добавляйте суффикс L для литералов больше 2³¹-1.

Для чисел с плавающей точкой:

  • Float (32 бита): около 7 значащих цифр. Всегда указывайте суффикс F: val price = 19.99F.
  • Double (64 бита): около 15 значащих цифр. Тип по умолчанию для дробных литералов.
val age: Int = 25
val bigNumber: Long = 3_000_000_000L
val price: Double = 19.99
val ratio: Float = 0.5F

Подчёркивания внутри чисел — ещё одна приятная возможность Kotlin: они игнорируются компилятором и служат только для читаемости.


Логический тип и символы

Boolean хранит true или false и используется в условиях и флагах. Char представляет одиночный символ и записывается в одинарных кавычках. Важно: в Kotlin символы не являются числами, как в Java, и не могут автоматически подставляться в арифметические выражения.

val isEnabled: Boolean = true
val letter: Char = 'A'
val digit: Char = '7'

Строки (String) стоят особняком — это не примитивный тип, а полноценный класс с богатым набором методов. Строки неизменяемы, и каждая операция над ними создаёт новый объект.


Строки и шаблоны

Одно из главных удобств Kotlin — строковые шаблоны. Внутри двойных кавычек вы можете вставлять значения переменных и даже выражения, заключённые в фигурные скобки:

val name = "Алексей"
val greeting = "Привет, $name! Тебе уже ${age + 1} лет."

Это заменяет громоздкие конкатенации и делает код чище. Многострочные строки заключаются в тройные кавычки и сохраняют форматирование.


Массивы: обычные и специализированные

Массивы в Kotlin представлены классом Array<T>. Создать его можно через функцию arrayOf() или конструктор с лямбдой. Для базовых типов существуют специализированные массивы IntArray, DoubleArray, CharArray — они компилируются в соответствующие Java-примитивные массивы и работают быстрее.

val numbers = arrayOf(1, 2, 3)
val zeros = IntArray(5) { 0 }          // [0,0,0,0,0]
val squares = IntArray(5) { it * it }  // [0,1,4,9,16]

Для работы с коллекциями в Android чаще используют списки (List), но понимание массивов необходимо для взаимодействия с Java-библиотеками.


Преобразование типов: явно и безопасно

В Kotlin нет неявного расширения типов, как в Java. Вы не можете передать Int туда, где ожидается Long, без явного вызова метода преобразования. Это сделано для предотвращения ошибок переполнения и потери точности.

val count: Int = 10
val bigCount: Long = count.toLong()
val text: String = count.toString()

Каждый числовой тип имеет методы toByte(), toShort(), toInt(), toLong(), toFloat(), toDouble(), а также toChar() и toString().


Nullable-типы: защита от null

Обычная переменная в Kotlin не может хранить null. Если значение может отсутствовать, после типа ставится вопросительный знак. Это вынуждает обрабатывать потенциальную пустоту до компиляции и практически исключает NullPointerException.

var name: String? = null
val length = name?.length ?: 0   // элвис-оператор

Основные приёмы работы с nullable-типами:

  • Безопасный вызов ?. — если переменная равна null, вся цепочка возвращает null и не выполняется.
  • Элвис-оператор ?: — задаёт значение по умолчанию, когда слева null.
  • Оператор !! — принуждает считать значение ненулевым и выбрасывает исключение, если оно null. Используйте только когда уверены.

В Android Studio вы сразу увидите предупреждение, если попытаетесь обратиться к nullable-переменной без проверки. Это одна из главных фишек Android Studio: уроки на Kotlin — среда подсказывает правильные конструкции на лету.


Как проверить тип и выполнить приведение

Оператор is проверяет, принадлежит ли объект указанному типу. После успешной проверки Kotlin автоматически выполняет смарт-каст — переменная временно приобретает проверенный тип без явного приведения. Для принудительного приведения служит оператор as, но его стоит использовать с осторожностью.

val obj: Any = "Hello"
if (obj is String) {
    println(obj.length)  // смарт-каст, obj теперь String
}

Такой подход сокращает код и делает его безопаснее по сравнению с классическим приведением в Java.


Практическое задание прямо в Android Studio

Чтобы закрепить тему, создайте новый проект в Android Studio и выполните простое упражнение. В функции main (или в Activity) объявите по одной переменной каждого типа, присвойте им значения и выведите в лог с помощью Log.d или println. Попробуйте преобразовать Int в String и обратно. Добавьте nullable-переменную и поработайте с элвис-оператором. Это отнимет десять минут, но даст гораздо больше, чем простое чтение.


Коротко об освоенном материале

Этот урок из цикла Android Studio: уроки на Kotlin познакомил вас с базовыми типами данных. Вы узнали, чем Kotlin отличается от Java в работе с числами и null, как объявлять переменные, преобразовывать значения и использовать смарт-каст. Теперь вы готовы двигаться дальше: к коллекциям, функциям и построению интерфейсов.