Любое приложение оперирует данными: числа, текст, флаги «да/нет». Прежде чем писать сложные экраны, важно разобраться, какие типы данных существуют в 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, как объявлять переменные, преобразовывать значения и использовать смарт-каст. Теперь вы готовы двигаться дальше: к коллекциям, функциям и построению интерфейсов.