Что такое тип с вопросительным знаком

Ответ

Тип с вопросительным знаком (?) в Kotlin обозначает nullable-тип, то есть переменная может хранить либо значение указанного типа, либо null.

Пример:

var name: String? = null // Допустимо null
name = "Alex" // Или строку

Без ? переменная не может быть null:

var name: String = "Alex" // Ошибка, если попытаться присвоить null

Особенности:

  • Требует проверки на null перед использованием (if, ?., !!, ?:)
  • Позволяет избежать NullPointerException на этапе компиляции
  • Часто используется в Android при работе с API, где поля могут отсутствовать

Ответ 18+ 🔞

А, ну это про вопросик в Котлине! Давай разжую, как есть, без этих заумных мануалов.

Смотри, когда ты пишешь String? — это как будто ты говоришь компилятору: «Слушай, чувак, эта переменная — хитрая жопа. Она может быть нормальной строкой, а может быть просто пустым местом, нихуя не значением». То есть null.

Вот пример, чтобы не ебать тебе мозг:

var имя: String? = null // Ну вот, поставил null — и всё ок, не ругается
имя = "Сашка" // А теперь присвоил реальное значение — тоже ок

А если ты этот вопросик уберёшь, то это уже строгий папаша:

var имя: String = "Сашка" // Тут всё чётко, имя есть
// имя = null // А вот эту строчку попробуй раскомментировать — получишь пиздюлину от компилятора сразу! Он тебе: «Какого хуя? Я же тебе сказал — без null тут!»

И вся фишка в чём? В том, что Котлин — он не дурак. Он тебя заранее ловит за руку, ещё когда код пишешь, а не когда приложение на телефоне пользователя уже накрылось медным тазом с NullPointerException. Удивление пиздец, да? В Джве это было обычным делом — получил null там, где не ждал, и приложение — хлоп. А тут тебе система: «Э, сабака сука, э бошка думай! Ты эту nullable-переменную проверил на null или как?»

Проверять можно по-разному:

  • if (имя != null) { ... } — классика, дедовский способ.
  • имя?.length — безопасный вызов. Если имяnull, то и результат всего выражения будет null, а не краш.
  • имя!!.length — это когда ты на 146% уверен, что там не null. Но если ошибся — получишь NPE и сам будешь виноват, крича «Ёпта!».
  • имя ?: "Гость" — элвис-оператор. Если слева null, то используй значение справа. Проще некуда.

Особенно это всё овердохуища полезно в андроиде. Ты же знаешь, эти API-шки с сервера — они же как мартышлюшки, что хотят, то и шлют. Поле может быть, а может и не быть. Вот тут ? и спасает — объявил поле как nullable, обработал случай с null, и твоё приложение не бздит при каждом чихе сети. Доверия к этим API, блядь, ноль, поэтому и защищайся.

Короче, вопросик — это не просто синтаксис, это философия. «Будь готов к тому, что значения может и не быть». И компилятор тебя заставит быть готовым. Умно, чё.