Есть ли в Kotlin примитивные типы?На уровне исходного кода Int и Boolean имеют методы как другие типы. JVM-компилятор использует примитивное представление, где возможно; nullable/generic-контекст может требовать обёрток. Это описание JVM-представления, не всех платформ Kotlin. Numbers.
Почему val l: Long = intValue не компилируется?Int не является подтипом Long, поэтому нужен intValue.toLong(). val l: Long = 5 корректен: целый литерал получает тип из контекста. Это не разрешает присваивать уже типизированную переменную Int без конверсии. Type conversion.
Чем Unit отличается от Nothing?У Unit одно значение, его можно вернуть нормально. У Nothing значений нет; функция с таким результатом не завершается нормально, например бросает исключение. Unit, Nothing.
Почему a === b для двух Int? со значением 1000 может вернуть false?Упакованные численные значения могут находиться в разных объектах, поэтому === может вернуть false при равных значениях. Нельзя утверждать, что 1000 всегда вне кеша: Integer.valueOf допускает кеш шире −128..127. Для сравнения значений нужен ==. Integer.valueOf.
Что такое value class?@JvmInline value class Email(val raw: String) создаёт отдельный тип с одним лежащим внутри значением. Компилятор может использовать это значение напрямую; переход к generic/interface-представлению и некоторые nullable-случаи требуют обёртки. Не обещайте отсутствие аллокаций без анализа конкретного использования. Inline value classes.
Почему компилируется val name: String = input ?: throw IllegalStateException()?throw имеет тип Nothing и не возвращает обычное значение. При input: String? успешная ветка Elvis даёт String, а правая прерывает вычисление исключением. Null safety, Nothing.
Чем == отличается от === в Kotlin?== — null-safe проверка структурного равенства через equals; === — идентичность ссылки там, где она имеет смысл. Для массивов содержимое сравнивают через contentEquals, поскольку обычное equals массива не сравнивает элементы. Сравнивать числа по идентичности не следует. Equality.