Spec-Zone.ru › Kotlin 2
Руководство по совместимости для Kotlin 1.4.x Поддержание актуальности языка и Удобство обновлений — фундаментальные принципы проектирования языка Kotlin. Первый гласит, что конструкции, препятствующие развитию языка, следует удалять, а второй — что об удалении следует заблаговременно сообщать, чтобы упростить перенос кода.
Хотя большинство изменений языка уже были анонсированы в других источниках, например в журналах изменений обновлений или предупреждениях компилятора, в этом документе они собраны вместе, чтобы предоставить полный справочник по переходу с Kotlin 1.3 на Kotlin 1.4.
Основные термины
В этом документе рассматривается несколько видов совместимости:
исходная : изменение, несовместимое с исходным кодом, не позволяет скомпилировать код, который раньше компилировался без ошибок и предупреждений
бинарная : два бинарных артефакта считаются бинарно-совместимыми, если их взаимная замена не приводит к ошибкам загрузки или связывания
поведенческая : изменение считается поведенчески несовместимым, если одна и та же программа ведёт себя по-разному до и после его применения
Помните, что эти определения относятся только к Kotlin. Совместимость кода на Kotlin с точки зрения других языков (например, Java) выходит за рамки этого документа.
Язык и стандартная библиотека
Неожиданное поведение инфиксного оператора in и ConcurrentHashMap
Проблема : KT-18053
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.4 будет запрещено автоматическое использование оператора contains, предоставленного реализациями java.util.Map, написанными на Java
Цикл устаревания :
< 1.4: добавить предупреждение для проблемных операторов в месте вызова
>= 1.4: повысить это предупреждение до ошибки; -XXLanguage:-ProhibitConcurrentHashMapContains можно использовать для временного возврата к поведению до версии 1.4
Запретить доступ к защищённым членам из публичных inline-членов
Проблема : KT-21178
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.4 будет запрещён доступ к защищённым членам из публичных inline-членов.
Цикл устаревания :
< 1.4: добавить предупреждение в месте вызова для проблемных случаев
1.4: повысить это предупреждение до ошибки; -XXLanguage:-ProhibitProtectedCallFromInline можно использовать для временного возврата к поведению до версии 1.4
Контракты при вызовах с неявными получателями
Проблема : KT-28672
Компонент : ядро языка
Тип несовместимого изменения : поведенческое
Краткое описание : в версии 1.4 умные приведения типов на основе контрактов будут доступны при вызовах с неявными получателями
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-ContractsOnCallsWithImplicitReceiver можно использовать для временного возврата к поведению до версии 1.4
Непоследовательное поведение при сравнении чисел с плавающей точкой
Проблемы : KT-22723
Компонент : ядро языка
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4 компилятор Kotlin будет использовать стандарт IEEE 754 для сравнения чисел с плавающей точкой
Цикл устаревания :
Отсутствие умного приведения типа для последнего выражения в обобщённой лямбде
Проблема : KT-15020
Компонент : ядро языка
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с версии 1.4 умные приведения типов для последних выражений в лямбдах будут применяться корректно
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Не полагайтесь на порядок аргументов-лямбд при приведении результата к Unit
Проблема : KT-36045
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 аргументы-лямбды будут разрешаться независимо, без неявного приведения к Unit
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Неверный общий супертип для raw-типа и типа целочисленного литерала приводит к небезопасному коду
Проблема : KT-35681
Компоненты : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 общий супертип raw-типа Comparable и типа целочисленного литерала будет более конкретным
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Проблема типобезопасности из-за того, что несколько одинаковых переменных типа инстанцируются разными типами
Проблема : KT-35679
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 компилятор Kotlin будет запрещать инстанцирование одинаковых переменных типа разными типами
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Проблема типобезопасности из-за некорректного отношения подтипов для типов-пересечений
Проблемы : KT-22474
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.4 отношение подтипов для типов-пересечений будет уточнено для более корректной работы
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Отсутствие несоответствия типов для пустого выражения when внутри лямбды
Проблема : KT-17995
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 для пустого выражения when будет возникать несоответствие типов, если оно используется в качестве последнего выражения лямбды
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Для лямбды с ранним возвратом выводится тип Any, если среди возможных возвращаемых значений есть целочисленный литерал
Проблема : KT-20226
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 в случаях с ранним возвратом для целочисленного типа, возвращаемого из лямбды, будет выводиться более конкретный тип
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Корректный захват проекций звёздочки с рекурсивными типами
Проблема : KT-33012
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 будет применимо больше кандидатов, поскольку захват рекурсивных типов будет работать корректнее
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Вычисление общего супертипа для неподходящего и гибкого типов приводит к некорректным результатам
Проблема : KT-37054
Компонент : ядро языка
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4 общий супертип гибких типов будет более конкретным, что позволит защититься от ошибок во время выполнения
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Проблема типобезопасности из-за отсутствия преобразования захваченного типа для аргумента nullable-типа
Проблема : KT-35487
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 отношение подтипов между захваченными и nullable-типами будет более корректным, что позволит защититься от ошибок во время выполнения
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Сохранение типа-пересечения для ковариантных типов после непроверенного приведения
Проблема : KT-37280
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 непроверенные приведения ковариантных типов дают тип-пересечение для умных приведений типов, а не тип непроверенного приведения.
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Утечка переменной типа из вывода типов построителя при использовании выражения this
Проблема : KT-32126
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 использование this внутри функций-построителей, таких как sequence {}, запрещено, если нет других подходящих ограничений
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Неверное разрешение перегрузки для контравариантных типов с nullable-аргументами типа
Проблема : KT-31670
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, если две перегрузки функции, принимающей контравариантные аргументы типа, различаются только nullable-статусом типа (например, In<T> и In<T?>), более конкретным считается nullable-тип.
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Вывод типов построителя с нен вложенными рекурсивными ограничениями
Проблема : KT-34975
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 функции-построители, такие как sequence {}, с типом, зависящим от рекурсивного ограничения внутри переданной лямбды, вызывают ошибку компилятора.
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Преждевременная фиксация переменной типа приводит к противоречивой системе ограничений
Проблема : KT-25175
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 в некоторых случаях вывод типов будет выполняться менее поспешно, что позволит найти непротиворечивую систему ограничений.
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых возможностей языка.
Запретить модификатор tailrec для открытых функций
Проблема : KT-18541
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 функции не могут одновременно иметь модификаторы open и tailrec.
Цикл устаревания :
Поле INSTANCE объекта-компаньона более видимо, чем сам класс объекта-компаньона
Проблема : KT-11567
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, если объект-компаньон является приватным, его поле INSTANCE также будет приватным
Цикл устаревания :
Внешний блок finally, вставленный перед return, не исключается из catch-интервала внутреннего блока try без finally
Проблема : KT-31923
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4, catch-интервал будет правильно вычисляться для вложенных блоков try/catch
Цикл устаревания :
Используйте упакованную версию inline-класса в качестве возвращаемого типа при ковариантных и специализированных для обобщённых типов переопределениях
Проблемы : KT-30419
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4 функции с ковариантными и специализированными для обобщённых типов переопределениями будут возвращать упакованные значения inline-классов
Цикл устаревания :
Не объявляйте проверяемые исключения в байт-коде JVM при делегировании интерфейсам Kotlin
Проблема : KT-35834
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.4 проверяемые исключения не будут генерироваться при делегировании интерфейсам Kotlin
Цикл устаревания :
< 1.4: прежнее поведение (подробности см. в описании проблемы)
>= 1.4: поведение изменено; для временного возврата к поведению до версии 1.4 можно использовать -XXLanguage:-DoNotGenerateThrowsForDelegatedKotlinMembers
Изменено поведение сигнатурно-полиморфных вызовов методов с единственным параметром vararg, чтобы избежать упаковки аргумента в другой массив
Проблема : KT-35469
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.4 аргумент сигнатурно-полиморфного вызова не будет упаковываться в другой массив
Цикл устаревания :
Некорректная обобщённая сигнатура в аннотациях, когда KClass используется в качестве параметра обобщённого типа
Проблема : KT-35207
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.4 будет исправлено некорректное сопоставление типов в аннотациях, когда KClass используется в качестве параметра обобщённого типа
Цикл устаревания :
Запретить оператор распаковки в сигнатурно-полиморфных вызовах
Проблема : KT-35226
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.4 будет запрещено использовать оператор распаковки (*) в сигнатурно-полиморфных вызовах
Цикл устаревания :
< 1.4: выдавать предупреждение при использовании оператора распаковки в сигнатурно-полиморфных вызовах
>= 1.5: повысить уровень этого предупреждения до ошибки; для временного возврата к поведению до версии 1.4 можно использовать -XXLanguage:-ProhibitSpreadOnSignaturePolymorphicCall
Изменить порядок инициализации значений по умолчанию для оптимизированных хвосторекурсивных функций
Проблема : KT-31540
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4 порядок инициализации хвосторекурсивных функций будет таким же, как у обычных функций
Цикл устаревания :
< 1.4: выдавать предупреждение в месте объявления проблемных функций
>= 1.4: поведение изменено; для временного возврата к поведению до версии 1.4 можно использовать -XXLanguage:-ProperComputationOrderOfTailrecDefaultParameters
Не генерировать атрибут ConstantValue для val, не являющихся const
Проблема : KT-16615
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4 компилятор не будет генерировать атрибут ConstantValue для val, не являющихся const
Цикл устаревания :
< 1.4: выдавать предупреждение с помощью инспекции IntelliJ IDEA
>= 1.4: поведение изменено; для временного возврата к поведению до версии 1.4 можно использовать -XXLanguage:-NoConstantValueAttributeForNonConstVals
Сгенерированные перегрузки для @JvmOverloads у открытых методов должны быть final
Проблема : KT-33240
Компоненты : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : перегрузки функций с @JvmOverloads будут генерироваться как final
Цикл устаревания :
Лямбды, возвращающие kotlin.Result, теперь возвращают упакованное значение вместо распакованного
Проблема : KT-39198
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4 лямбды, возвращающие значения типа kotlin.Result, будут возвращать упакованные значения вместо распакованных
Цикл устаревания :
Унифицировать исключения при проверках на null
Проблема : KT-22275
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4 все проверки на null во время выполнения будут выбрасывать java.lang.NullPointerException
Цикл устаревания :
< 1.4: проверки на null во время выполнения выбрасывают разные исключения, например KotlinNullPointerException, IllegalStateException, IllegalArgumentException и TypeCastException
>= 1.4: все проверки на null во время выполнения выбрасывают java.lang.NullPointerException. Для временного возврата к поведению до версии 1.4 можно использовать -Xno-unified-null-checks
Сравнение чисел с плавающей точкой в операциях contains, indexOf и lastIndexOf для массивов и списков: IEEE 754 или полный порядок
Проблема : KT-28753
Компонент : kotlin-stdlib (JVM)
Тип несовместимого изменения : поведенческое
Краткое описание : реализация List, возвращаемая из Double/FloatArray.asList(), будет реализовывать contains, indexOf и lastIndexOf, чтобы они использовали равенство при полном порядке
Цикл устаревания :
Постепенно изменить возвращаемый тип функций min и max для коллекций на ненулевой
Проблема : KT-38854
Компонент : kotlin-stdlib (JVM)
Тип несовместимого изменения : исходный код
Краткое описание : в версии 1.6 возвращаемый тип функций коллекций min и max будет изменён на ненулевой
Цикл устаревания :
1.4: добавить функции ...OrNull в качестве синонимов и объявить затронутый API устаревшим (подробности см. в описании проблемы)
1.5.x: повысить уровень устаревания затронутого API до ошибки
>=1.6: повторно добавить затронутый API, но с ненулевым возвращаемым типом
Объявить appendln устаревшим в пользу appendLine
Проблема : KT-38754
Компонент : kotlin-stdlib (JVM)
Тип несовместимого изменения : исходный код
Краткое описание : StringBuilder.appendln() будет объявлена устаревшей в пользу StringBuilder.appendLine()
Цикл устаревания :
Объявить устаревшими преобразования типов с плавающей точкой в Short и Byte
Проблема : KT-30360
Компонент : kotlin-stdlib (JVM)
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 преобразования типов с плавающей точкой в Short и Byte будут объявлены устаревшими
Цикл устаревания :
Немедленно сообщать об ошибке в Regex.findAll при недопустимом startIndex
Проблема : KT-28356
Компонент : kotlin-stdlib
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4 функция findAll будет проверять, что startIndex входит в диапазон допустимых индексов позиций входной последовательности символов при вызове findAll, и выбрасывать IndexOutOfBoundsException, если это не так
Цикл устаревания :
Удалить устаревший kotlin.coroutines.experimental
Проблема : KT-36083
Компонент : kotlin-stdlib
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 устаревший API kotlin.coroutines.experimental удалён из stdlib
Цикл устаревания :
< 1.4: kotlin.coroutines.experimental объявлен устаревшим с уровнем ERROR
>= 1.4: kotlin.coroutines.experimental удалён из stdlib. Для JVM предоставляется отдельный артефакт совместимости (подробности см. в описании проблемы).
Удалить устаревший оператор mod
Проблема : KT-26654
Компонент : kotlin-stdlib
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4 оператор mod для числовых типов удалён из stdlib
Цикл устаревания :
Скрыть метод-член Throwable.addSuppressed и предпочесть ему функцию-расширение
Проблема : KT-38777
Компонент : kotlin-stdlib
Тип несовместимого изменения : поведенческое
Краткое описание : теперь предпочтение отдаётся функции-расширению Throwable.addSuppressed(), а не методу-члену Throwable.addSuppressed()
Цикл устаревания :
Функция capitalize должна преобразовывать диграфы в регистр заголовка
Проблема : KT-38817
Компонент : kotlin-stdlib
Тип несовместимого изменения : поведенческое
Краткое описание : функция String.capitalize() теперь переводит диграфы сербско-хорватского латинского алфавита Гая (сербско-хорватский латинский алфавит Гая ) в регистр заголовка (Dž вместо DŽ)
Цикл устаревания :
Аргументы компилятора с символами-разделителями в Windows необходимо заключать в двойные кавычки
Проблема : KT-41309
Компонент : CLI
Тип несовместимого изменения : поведенческое
Краткое описание : в Windows аргументы kotlinc.bat, содержащие символы-разделители (пробелы, =, ;, ,), теперь необходимо заключать в двойные кавычки (")
Цикл устаревания :
< 1.4: все аргументы компилятора передаются без кавычек
>= 1.4: аргументы компилятора, содержащие символы-разделители (пробелы, =, ;, ,), необходимо заключать в двойные кавычки (")
KAPT: изменились имена синтетических методов $annotations() для свойств
Проблема : KT-36926
Компонент : KAPT
Тип несовместимого изменения : поведенческое
Краткое описание : в версии 1.4 изменились имена синтетических методов $annotations(), генерируемых KAPT для свойств
Цикл устаревания :
< 1.4: имена синтетических методов $annotations() для свойств соответствуют шаблону <propertyName>@annotations()
>= 1.4: имена синтетических методов $annotations() для свойств включают префикс get: get<PropertyName>@annotations()
26 мая 2025