Spec-Zone.ru › Kotlin 2
Руководство по совместимости для Kotlin 2.1.x Поддержание современности языка и Удобное обновление — одни из основополагающих принципов проектирования языка Kotlin. Первый гласит, что конструкции, препятствующие развитию языка, следует удалять, а второй — что об этом удалении следует заблаговременно сообщать, чтобы миграция кода проходила как можно проще.
Хотя об изменениях языка уже сообщалось через другие каналы, например в примечаниях к обновлениям или предупреждениях компилятора, в этом документе собраны все изменения и приводится полный справочник по миграции с Kotlin 2.0 на Kotlin 2.1.
Основные термины
В этом документе рассматриваются несколько видов совместимости:
исходный код : изменение, несовместимое с исходным кодом, не позволяет компилировать код, который раньше успешно компилировался (без ошибок и предупреждений)
бинарная совместимость : два бинарных артефакта считаются бинарно совместимыми, если их взаимная замена не приводит к ошибкам загрузки или связывания
поведенческая совместимость : изменение считается несовместимым с точки зрения поведения, если одна и та же программа ведет себя по-разному до и после применения изменения
Обратите внимание, что эти определения применимы только к чистому Kotlin. Совместимость кода Kotlin с точки зрения других языков (например, Java) выходит за рамки этого документа.
Язык
Удаление версий языка 1.4 и 1.5
Проблема : KT-60521
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : В Kotlin 2.1 появилась версия языка 2.1 и прекращена поддержка версий языка 1.4 и 1.5. Версии языка 1.6 и 1.7 объявлены устаревшими.
Цикл устаревания :
1.6.0: выдавать предупреждение для версии языка 1.4
1.9.0: выдавать предупреждение для версии языка 1.5
2.1.0: выдавать предупреждение для версий языка 1.6 и 1.7; повысить уровень предупреждения до ошибки для версий языка 1.4 и 1.5
Изменение поведения функции typeOf() в Kotlin/Native
Проблема : KT-70754
Компонент : ядро языка
Тип несовместимого изменения : поведенческое
Краткое описание : Поведение функции typeOf() в Kotlin/Native приведено в соответствие с Kotlin/JVM для обеспечения единообразия на разных платформах.
Цикл устаревания :
Запрет на раскрытие типов через ограничения параметров типа
Проблема : KT-69653
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : Теперь запрещено раскрывать типы с более низким уровнем видимости через ограничения параметров типа. Это устраняет несоответствия в правилах видимости типов. Благодаря этому к ограничениям параметров типа применяются те же правила видимости, что и к классам, и предотвращаются такие проблемы, как ошибки проверки IR в JVM.
Цикл устаревания :
Запрет на наследование абстрактного свойства var и свойства val с одинаковым именем
Проблема : KT-58659
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : Если класс наследует абстрактное свойство var от интерфейса и свойство val с тем же именем от суперкласса, теперь это приводит к ошибке компиляции. Это устраняет сбои во время выполнения, вызванные отсутствием сеттеров в таких случаях.
Цикл устаревания :
2.1.0: выдавать предупреждение (или ошибку в прогрессивном режиме), если класс наследует абстрактное свойство var от интерфейса и свойство val с тем же именем от суперкласса
2.2.0: повысить уровень предупреждения до ошибки
Выдача ошибки при обращении к неинициализированным элементам enum
Проблема : KT-68451
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : Теперь компилятор сообщает об ошибке, если к неинициализированным элементам enum обращаются во время инициализации класса enum или его элементов. Это приводит поведение в соответствие с правилами инициализации свойств-членов, предотвращая исключения во время выполнения и обеспечивая единообразную логику.
Цикл устаревания :
Изменения в распространении smart cast в K2
Проблема : KTLC-34
Компонент : ядро языка
Тип несовместимого изменения : поведенческое
Краткое описание : Компилятор K2 изменяет поведение распространения smart cast, вводя двунаправленное распространение информации о типах для выведенных переменных, например val x = y. Переменные с явно заданным типом, такие как val x: T = y, больше не распространяют информацию о типе, что обеспечивает более строгое соответствие объявленным типам.
Цикл устаревания :
Исправление обработки переопределений свойств-расширений-членов в подклассах Java
Проблема : KTLC-35
Компонент : ядро языка
Тип несовместимого изменения : поведенческое
Краткое описание : Теперь геттеры свойств-расширений-членов, переопределенных подклассами Java, скрыты в области видимости подкласса. Их поведение приведено в соответствие с поведением обычных свойств Kotlin.
Цикл устаревания :
Приведение видимости геттеров и сеттеров свойств var, переопределяющих protected val, к единообразию
Проблема : KTLC-36
Компонент : ядро языка
Тип несовместимого изменения : бинарное
Краткое описание : Видимость геттеров и сеттеров свойств var, переопределяющих свойство protected val, теперь единообразна: оба наследуют видимость переопределяемого свойства val.
Цикл устаревания :
Повышение уровня диагностики несоответствий nullability в JSpecify до ошибок
Проблема : KTLC-11
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : Несоответствия nullability, связанные с org.jspecify.annotations, например @NonNull, @Nullable и @NullMarked, теперь считаются ошибками, а не предупреждениями. Это обеспечивает более строгую безопасность типов при взаимодействии с Java. Чтобы изменить уровень этих диагностических сообщений, используйте параметр компилятора -Xnullability-annotations.
Цикл устаревания :
1.6.0: выдавать предупреждения о возможных несоответствиях nullability
1.8.20: расширить предупреждения, включив отдельные аннотации JSpecify, в том числе @Nullable, @NullnessUnspecified, @NullMarked и устаревшие аннотации из org.jspecify.nullness (JSpecify 0.2 и более ранние версии)
2.0.0: добавить поддержку аннотации @NonNull
2.1.0: изменить режим по умолчанию на strict для аннотаций JSpecify, преобразовав предупреждения в ошибки; чтобы переопределить поведение по умолчанию, используйте -Xnullability-annotations=@org.jspecify.annotations:warning или -Xnullability-annotations=@org.jspecify.annotations:ignore
Изменение разрешения перегрузок: при неоднозначности приоритет отдается функциям-расширениям, а не вызовам invoke
Проблема : KTLC-37
Компонент : ядро языка
Тип несовместимого изменения : поведенческое
Краткое описание : При неоднозначности разрешение перегрузок теперь последовательно отдает приоритет функциям-расширениям, а не вызовам invoke. Это устраняет несоответствия в логике разрешения для локальных функций и свойств. Изменение применяется только после повторной компиляции и не затрагивает предварительно скомпилированные бинарные файлы.
Цикл устаревания :
2.1.0: изменить разрешение перегрузок так, чтобы для функций-расширений с совпадающими сигнатурами приоритет последовательно отдавался функциям-расширениям, а не вызовам invoke; изменение применяется только после повторной компиляции и не затрагивает предварительно скомпилированные бинарные файлы
Запрет на возврат nullable-значений из лямбд в SAM-конструкторах функциональных интерфейсов JDK
Проблема : KTLC-42
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : Возврат nullable-значений из лямбд в SAM-конструкторах функциональных интерфейсов JDK теперь приводит к ошибке компиляции, если указанный аргумент типа не допускает null. Это устраняет проблемы, при которых несоответствия nullability могли приводить к исключениям во время выполнения, и обеспечивает более строгую безопасность типов.
Цикл устаревания :
Исправление обработки private-членов, конфликтующих с public-членами в Kotlin/Native
Проблема : KTLC-43
Компонент : ядро языка
Тип несовместимого изменения : поведенческое
Краткое описание : В Kotlin/Native private-члены больше не переопределяют и не конфликтуют с public-членами суперкласса. Поведение приведено в соответствие с Kotlin/JVM. Это устраняет несоответствия при разрешении переопределений и исключает неожиданное поведение, вызванное раздельной компиляцией.
Цикл устаревания :
Запрет на доступ к private-функциям-операторам из public inline-функций
Проблема : KTLC-71
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : К private-функциям-операторам, таким как getValue(), setValue(), provideDelegate(), hasNext() и next(), больше нельзя обращаться из public inline-функций.
Цикл устаревания :
Запрет на передачу недопустимых аргументов инвариантным параметрам с аннотацией @UnsafeVariance
Проблема : KTLC-72
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : Теперь компилятор игнорирует аннотации @UnsafeVariance при проверке типов, обеспечивая более строгую безопасность типов для инвариантных параметров типа. Это предотвращает недопустимые вызовы, в которых используется @UnsafeVariance для обхода ожидаемых проверок типов.
Цикл устаревания :
Выдача ошибок nullability для nullable-аргументов с уровнем ошибки у типов Java с уровнем предупреждения
Проблема : KTLC-100
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : Теперь компилятор обнаруживает несоответствия nullability в методах Java, где nullable-тип с уровнем предупреждения содержит аргументы типа с более строгим уровнем nullability — уровнем ошибки. Это позволяет правильно сообщать об ошибках в аргументах типа, которые ранее игнорировались.
Цикл устаревания :
Выдача сообщений о неявном использовании недоступных типов
Проблема : KTLC-3
Компонент : ядро языка
Тип несовместимого изменения : исходный код
Краткое описание : Теперь компилятор сообщает об использовании недоступных типов в литералах функций и аргументах типа, предотвращая ошибки компиляции и выполнения, вызванные неполной информацией о типах.
Цикл устаревания :
2.0.0: выдавать предупреждения для литералов функций с параметрами или получателями недоступных негeneric-типов, а также для типов с недоступными аргументами типа; выдавать ошибки для литералов функций с параметрами или получателями недоступных generic-типов и для типов с недоступными generic-аргументами типа в определенных случаях
2.1.0: повысить уровень предупреждений до ошибок для литералов функций с параметрами и получателями недоступных негeneric-типов
2.2.0: повысить уровень предупреждений до ошибок для типов с недоступными аргументами типа
Стандартная библиотека
Устаревание функций преобразования регистра для Char и String, зависящих от локали
Проблема : KT-43023
Компонент : kotlin-stdlib
Тип несовместимого изменения : исходный код
Краткое описание : Среди прочих API стандартной библиотеки Kotlin устарели функции преобразования регистра для Char и String, зависящие от локали, например Char.toUpperCase() и String.toLowerCase(). Замените их альтернативами, не зависящими от локали, например String.lowercase(), или явно укажите локаль для поведения, зависящего от локали, например String.lowercase(Locale.getDefault()).
Полный список устаревших API стандартной библиотеки Kotlin в Kotlin 2.1.0 см. в разделе KT-71628 .
Цикл устаревания :
1.4.30: представлены экспериментальные альтернативы, не зависящие от локали
1.5.0: функции преобразования регистра, зависящие от локали, помечены как устаревшие с предупреждением
2.1.0: предупреждение повышено до ошибки
Удаление артефакта JAR kotlin-stdlib-common
Проблема : KT-62159
Компонент : kotlin-stdlib
Тип несовместимого изменения : бинарная совместимость
Краткое описание : Артефакт kotlin-stdlib-common.jar, ранее использовавшийся для метаданных объявлений в устаревшем формате мультиплатформенных проектов, признан устаревшим и заменен файлами .klib — стандартным форматом метаданных общих объявлений в мультиплатформенных проектах. Это изменение не затрагивает основные артефакты kotlin-stdlib.jar и kotlin-stdlib-all.jar.
Цикл устаревания :
Устаревание appendln() в пользу appendLine()
Проблема : KTLC-27
Компонент : kotlin-stdlib
Тип несовместимого изменения : исходный код
Краткое описание : StringBuilder.appendln() признан устаревшим в пользу StringBuilder.appendLine().
Цикл устаревания :
Проблема : KT-69545
Компонент : kotlin-stdlib
Тип несовместимого изменения : исходный код
Краткое описание : API Kotlin/Native, связанные с заморозкой и ранее помеченные аннотацией @FreezingIsDeprecated, теперь признаны устаревшими. Это связано с появлением нового менеджера памяти, который устраняет необходимость замораживать объекты для совместного использования потоками. Подробную информацию о миграции см. в руководстве по миграции Kotlin/Native .
Цикл устаревания :
1.7.20: API, связанные с заморозкой, помечены как устаревшие с предупреждением
2.1.0: предупреждение повышено до ошибки
Изменение поведения Map.Entry: немедленная ошибка при структурном изменении
Проблема : KTLC-23
Компонент : kotlin-stdlib
Тип несовместимого изменения : поведение
Краткое описание : При обращении к паре ключ-значение Map.Entry после структурного изменения связанной с ней карты теперь выбрасывается исключение ConcurrentModificationException.
Цикл устаревания :
Устаревание KotlinCompilationOutput#resourcesDirProvider
Проблема : KT-69255
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : Поле KotlinCompilationOutput#resourcesDirProvider признано устаревшим. Вместо него используйте KotlinSourceSet.resources в скрипте сборки Gradle, чтобы добавить дополнительные каталоги ресурсов.
Цикл устаревания :
Устаревание функции registerKotlinJvmCompileTask(taskName, moduleName)
Проблема : KT-69927
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : Функция registerKotlinJvmCompileTask(taskName, moduleName) признана устаревшей в пользу новой функции registerKotlinJvmCompileTask(taskName, compilerOptions, explicitApiMode), которая теперь принимает KotlinJvmCompilerOptions. Это позволяет передать экземпляр compilerOptions, обычно из расширения или цели, со значениями, используемыми в качестве значений по умолчанию для параметров задачи.
Цикл устаревания :
Устаревание функции registerKaptGenerateStubsTask(taskName)
Проблема : KT-70383
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : Функция registerKaptGenerateStubsTask(taskName) признана устаревшей. Вместо нее используйте новую функцию registerKaptGenerateStubsTask(compileTask, kaptExtension, explicitApiMode). Эта версия позволяет связать значения по умолчанию с соответствующей задачей KotlinJvmCompile, чтобы обе задачи использовали один и тот же набор параметров.
Цикл устаревания :
Устаревание интерфейсов KotlinTopLevelExtension и KotlinTopLevelExtensionConfig
Проблема : KT-71602
Компонент : Gradle
Тип несовместимого изменения : поведение
Краткое описание : Интерфейсы KotlinTopLevelExtension и KotlinTopLevelExtensionConfig признаны устаревшими в пользу нового интерфейса KotlinTopLevelExtension. Этот интерфейс объединяет KotlinTopLevelExtensionConfig, KotlinTopLevelExtension и KotlinProjectExtension, упрощая иерархию API и предоставляя официальный доступ к инструментарию JVM и свойствам компилятора.
Цикл устаревания :
Удаление kotlin-compiler-embeddable из зависимостей среды выполнения сборки
Проблема : KT-61706
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : Зависимость kotlin-compiler-embeddable удалена из среды выполнения Kotlin Gradle Plugin (KGP). Необходимые модули теперь включены непосредственно в артефакты KGP; версия языка Kotlin ограничена версией 2.0 для поддержки совместимости со средой выполнения Gradle Kotlin в версиях ниже 8.2.
Цикл устаревания :
Сокрытие символов компилятора в API Kotlin Gradle Plugin
Проблема : KT-70251
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : Символы модулей компилятора, включенные в Kotlin Gradle Plugin (KGP), например KotlinCompilerVersion, скрыты от публичного API, чтобы предотвратить их непреднамеренное использование в скриптах сборки.
Цикл устаревания :
Добавление поддержки нескольких файлов конфигурации стабильности
Проблема : KT-68345
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : Свойство stabilityConfigurationFile расширения Compose признано устаревшим в пользу нового свойства stabilityConfigurationFiles, позволяющего указывать несколько файлов конфигурации.
Цикл устаревания :
Проблема : KT-65565
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : Поддержка следующих идентификаторов платформенных плагинов удалена:
Цикл устаревания :
26 мая 2025 г.