0Pricing
Kotlin Academy · Урок

Платформенные типы

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 — локальная установка не требуется.

Все уроки этого курса

  1. Типы Nullable и Non-Null
  2. Безопасные вызовы и Elvis
  3. Оператор !!
  4. Платформенные типы
← Назад к Kotlin Academy