Платформенные типы
Nullability из Java
«Платформенные типы» — бесплатный урок Kotlin Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Kotlin Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Kotlin Academy содержит 4 уроков всего.
Kotlin и Java
Kotlin работает на JVM и постоянно вызывает код Java. Но в Java нет понятия типов, допускающих отсутствие значения, и ненулевых типов.
Как же Kotlin обрабатывает значение, полученное из Java? С помощью платформенных типов.
Что такое платформенный тип
Платформенный тип — это тип, который Kotlin получает из Java, но его возможность содержать нулевое значение неизвестна.
Kotlin записывает его как String! в сообщениях об ошибках. Восклицательный знак означает: значение может быть нулевым, а может быть ненулевым — Kotlin не будет принудительно выбирать один из вариантов.
Ослабленная проверка
Для платформенных типов Kotlin ослабляет проверки на нулевые значения. Вы можете обращаться со значением как с ненулевым без ошибки компилятора.
Компромисс заключается в следующем: если значение действительно нулевое, во время выполнения возникает NullPointerException.
Тип выбираете Вы
Сохраняя значение платформенного типа, Вы решаете, какой тип ему назначить:
- как ненулевой
String→ удобно, но рискованно - как допускающий отсутствие значения
String?→ безопасно и явно
Этот пример на Kotlin имитирует такой выбор.
fun fromJava(): String? = "value from Java"
fun main() {
val safe: String? = fromJava()
println(safe?.length)
}Рискованный выбор
Если Вы предполагаете, что значение ненулевое, а источник возвращает нулевое значение, сбой происходит при присваивании или первом использовании.
В этом и заключается скрытая опасность платформенных типов.
fun fromJava(): String? = null
fun main() {
try {
val risky: String = fromJava()!!
println(risky.length)
} catch (e: NullPointerException) {
println("Null came from the Java side")
}
}Аннотации помогают
Библиотеки Java могут использовать такие аннотации, как @Nullable и @NotNull.
Если они присутствуют, Kotlin учитывает их и предоставляет правильный тип String? или String вместо платформенного типа.
Рекомендуемый подход: считайте значение допускающим отсутствие значения
При вызове кода Java без аннотаций безопаснее всего считать результат допускающим нулевое значение.
Указывайте для переменной тип с ? и используйте безопасные вызовы, как для любого значения Kotlin, допускающего отсутствие значения.
fun fromJava(): String? = "data"
fun main() {
val value: String? = fromJava()
val length = value?.length ?: 0
println(length)
}Защитные границы
Считайте границу с Java ненадёжной. Проверяйте значения или задавайте для них значения по умолчанию сразу при передаче в код Kotlin.
После этого остальная часть кода будет работать с корректными типами Kotlin.
fun fromJava(): String? = null
fun main() {
val name = fromJava() ?: "default"
// from here on, name is a clean non-null String
println(name.uppercase())
}Почему Kotlin это допускает
Kotlin мог бы считать любое значение из Java допускающим нулевое значение, но это сделало бы взаимодействие с Java мучительно многословным.
Платформенные типы — практичный компромисс: удобство и возможность использовать строгую проверку.
Как распознать платформенные типы
Вы не будете самостоятельно писать String!. Он появляется только в подсказках среды разработки и сообщениях об ошибках, когда Вы наводите указатель на значения, полученные из Java.
Увидев !, намеренно определите, может ли значение быть нулевым.
Объединяем всё
Платформенные типы связывают Java и Kotlin:
- Их возможность содержать нулевое значение неизвестна и обозначается как
Type! - Kotlin позволяет выбрать тип, допускающий или не допускающий нулевое значение
- Если Вы не уверены, считайте значение допускающим нулевое значение — так безопаснее
- Аннотации устраняют необходимость гадать
fun fromJava(): String? = "safe value"
fun main() {
val value: String? = fromJava()
println(value?.uppercase() ?: "missing")
}Быстрая проверка
Проверьте, насколько хорошо Вы понимаете платформенные типы.
Итоги
Вы узнали, как возможность значения быть нулевым пересекает границу Java:
- Платформенные типы имеют неизвестную возможность содержать нулевое значение
- Kotlin ослабляет проверки, но ошибочное предположение приводит к NPE во время выполнения
- Считайте значения допускающими нулевое значение и задавайте значения по умолчанию на границе
- Аннотации Java восстанавливают корректные типы
На этом подробное изучение безопасной работы с отсутствующими значениями завершено.
Часто задаваемые вопросы
Урок «Платформенные типы» бесплатный?
Да — полный текст урока «Платформенные типы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Kotlin Academy, подпишись на CoddyKit PRO. Курс Kotlin Academy содержит 4 уроков всего.
Чему я научусь в уроке «Платформенные типы»?
Nullability из Java Ты практикуешь Kotlin Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Kotlin Academy?
Предыдущий опыт не требуется. Kotlin Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Платформенные типы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Kotlin Academy?
Да. Каждый урок Kotlin Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Типы Nullable и Non-Null
- Безопасные вызовы и Elvis
- Оператор !!
- Платформенные типы