Руководство по совместимости для Kotlin 2.0.x
Поддержание современности языка и Удобство обновлений — одни из фундаментальных принципов проектирования языка Kotlin. Первый гласит, что конструкции, препятствующие развитию языка, следует удалять, а второй — что об этом удалении следует заблаговременно сообщать, чтобы упростить миграцию кода.
Хотя о большинстве изменений языка уже сообщалось в других источниках, например в обновленных журналах изменений или предупреждениях компилятора, в этом документе приводится полное руководство по миграции с Kotlin 1.9 на Kotlin 2.0.
Основные термины
В этом документе рассматриваются несколько видов совместимости:
исходная: изменение, нарушающее совместимость исходного кода, не позволяет скомпилировать код, который раньше компилировался без ошибок и предупреждений
бинарная: два бинарных артефакта считаются бинарно-совместимыми, если их взаимная замена не приводит к ошибкам загрузки или связывания
поведенческая: изменение считается нарушающим поведенческую совместимость, если одна и та же программа ведет себя по-разному до и после применения изменения
Обратите внимание, что эти определения применимы только к Kotlin. Совместимость кода Kotlin с точки зрения других языков (например, Java) выходит за рамки этого документа.
Язык
Устаревание использования синтетического сеттера для проецированного получателя
Исправление манглирования при вызове функций с параметрами встроенного класса, перегруженных в подклассе Java
Исправление алгоритма аппроксимации типов для контравариантных захваченных типов
Запрет доступа к значению свойства до его инициализации
Выдача ошибки при неоднозначности импортированных классов с одинаковыми именами
Генерация лямбд Kotlin с помощью invokedynamic и LambdaMetafactory по умолчанию
Запрет условия if с одной ветвью там, где требуется выражение
Запрет нарушения собственных верхних границ при передаче проекции со звёздочкой обобщённого типа
Аппроксимация анонимных типов в возвращаемом типе приватных inline-функций
Изменение поведения разрешения перегрузки: приоритет локальных вызовов функций-расширений над соглашениями invoke для свойств локального функционального типа
Выдача ошибки при конфликте унаследованных членов из-за изменения надтипа в бинарной зависимости
Игнорирование аннотаций @UnsafeVariance для параметров инвариантных типов
Изменение типа ссылок на член объекта-компаньона вне вызова
Запрет раскрытия анонимных типов из приватных inline-функций
Выдача ошибки при небезопасном smart cast после выхода из цикла while
Выдача ошибки при присваивании переменной типа-пересечения значения, не являющегося подтипом этого типа-пересечения
Требование opt-in, если интерфейс, созданный с помощью SAM-конструктора, содержит метод, требующий opt-in
Запрет нарушения верхней границы в конструкторах typealias
Согласование фактического типа переменной деструктуризации с явно указанным типом
Требование opt-in при вызове конструктора с типами параметров, значения по умолчанию которых требуют opt-in
Выдача сообщения о неоднозначности между свойством и элементом перечисления с одинаковым именем на одном уровне области видимости
Изменение поведения разрешения квалификаторов: приоритет свойства объекта-компаньона над элементом перечисления
Разрешение типа получателя вызова invoke и типа функции invoke так, как если бы они были записаны в десахаризованной форме
Запрет раскрытия приватных членов класса через неприватные inline-функции
Исправление обнуляемости заведомо необнуляемых типов в проецированных обобщённых типах
Изменение выводимого типа префиксного инкремента: соответствие возвращаемому типу геттера вместо возвращаемого типа оператора inc()
Проверять ограничения при наследовании внутренних классов от обобщённых внутренних классов, объявленных в суперклассах
Запретить присваивание ссылок на вызываемые элементы с типами SAM, если ожидаемый тип — тип функции с параметром типа функции
Учитывать область видимости объекта-компаньона при разрешении аннотаций для объектов-компаньонов
Изменить семантику вычисления сочетания безопасных вызовов и операторов-соглашений
Требовать немедленной инициализации свойств с резервным полем и пользовательским сеттером
Запретить преобразование в Unit для произвольных выражений при вызове по соглашению оператора invoke
Запретить присваивание значения nullable полю Java, не допускающему null, при обращении к полю через безопасный вызов
Требовать тип со звёздной проекцией при переопределении метода Java, содержащего параметр типа raw
Изменить разрешение ссылки (V)::foo, если у V есть объект-компаньон
Запретить неявный доступ к непубличному API в фактически публичных inline-функциях
Запретить аннотации use-site get для геттеров свойств
Запретить неявный вывод параметров типа в ограничения сверху в лямбда-функциях с выводом типов для построителей
Сохранять nullable-свойство при аппроксимации локальных типов в публичных сигнатурах
Убрать особую обработку false && ... и false || ... для смарт-приведения типов
Запретить inline open-функции в перечислениях
Инструменты
Изменения видимости в Gradle
Устаревание DSL kotlinOptions
Устаревание compilerOptions в DSL KotlinCompilation
Устаревание старых способов обработки CInteropProcess
Удаление свойства Gradle kotlin.useK2
Удаление устаревших идентификаторов плагинов платформ
Удаление параметра компилятора JavaScript outputFile
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/compatibility-guide-20.html