Spec-Zone.ru › Kotlin 2

Руководство по совместимости для Kotlin 2.0.x

Поддержание современности языка и Удобство обновлений — одни из фундаментальных принципов проектирования языка Kotlin. Первый гласит, что конструкции, препятствующие развитию языка, следует удалять, а второй — что об этом удалении следует заблаговременно сообщать, чтобы упростить миграцию кода.

Хотя о большинстве изменений языка уже сообщалось в других источниках, например в обновленных журналах изменений или предупреждениях компилятора, в этом документе приводится полное руководство по миграции с Kotlin 1.9 на Kotlin 2.0.

Компилятор Kotlin K2 представлен в составе Kotlin 2.0. Сведения о преимуществах нового компилятора, изменениях, с которыми вы можете столкнуться при миграции, и способе возврата к предыдущему компилятору см. в документе Руководство по миграции на компилятор K2.

Основные термины

В этом документе рассматриваются несколько видов совместимости:

  • исходная: изменение, нарушающее совместимость исходного кода, не позволяет скомпилировать код, который раньше компилировался без ошибок и предупреждений

  • бинарная: два бинарных артефакта считаются бинарно-совместимыми, если их взаимная замена не приводит к ошибкам загрузки или связывания

  • поведенческая: изменение считается нарушающим поведенческую совместимость, если одна и та же программа ведет себя по-разному до и после применения изменения

Обратите внимание, что эти определения применимы только к Kotlin. Совместимость кода Kotlin с точки зрения других языков (например, Java) выходит за рамки этого документа.

Язык

Устаревание использования синтетического сеттера для проецированного получателя

Задача: KT-54309

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Краткое описание: При использовании синтетического сеттера класса Java для присваивания типа, несовместимого с проецированным типом класса, возникает ошибка.

Цикл устаревания:

  • 1.8.20: выдавать предупреждение, если тип параметра синтетического сеттера свойства проецирован в контравариантной позиции, из-за чего типы аргументов в месте вызова несовместимы

  • 2.0.0: повысить уровень предупреждения до ошибки

Исправление манглирования при вызове функций с параметрами встроенного класса, перегруженных в подклассе Java

Задача: KT-56545

Компонент: Ядро языка

Тип несовместимого изменения: поведенческое

Цикл устаревания:

  • 2.0.0: использовать правильное поведение манглирования при вызове функций; чтобы вернуться к прежнему поведению, используйте параметр компилятора -XXLanguage:-MangleCallsToJavaMethodsWithValueClasses.

Исправление алгоритма аппроксимации типов для контравариантных захваченных типов

Задача: KT-49404

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.8.20: выдавать предупреждение при проблемных вызовах

  • 2.0.0: повысить уровень предупреждения до ошибки

Запрет доступа к значению свойства до его инициализации

Задача: KT-56408

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: выдавать ошибку при обращении к свойству до его инициализации в соответствующих контекстах

Выдача ошибки при неоднозначности импортированных классов с одинаковыми именами

Задача: KT-57750

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: выдавать ошибку при разрешении имени класса, присутствующего в нескольких пакетах, импортированных с помощью импорта со звёздочкой

Генерация лямбд Kotlin с помощью invokedynamic и LambdaMetafactory по умолчанию

Задача: KT-45375

Компонент: Ядро языка

Тип несовместимого изменения: поведенческое

Цикл устаревания:

  • 2.0.0: реализовать новое поведение; по умолчанию лямбды генерируются с помощью invokedynamic и LambdaMetafactory

Запрет условия if с одной ветвью там, где требуется выражение

Задача: KT-57871

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: выдавать ошибку, если условие if содержит только одну ветвь

Запрет нарушения собственных верхних границ при передаче проекции со звёздочкой обобщённого типа

Задача: KT-61718

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: выдавать ошибку при нарушении собственных верхних границ вследствие передачи проекции со звёздочкой обобщённого типа

Аппроксимация анонимных типов в возвращаемом типе приватных inline-функций

Задача: KT-54862

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.9.0: выдавать предупреждение для приватных inline-функций, если выведенный возвращаемый тип содержит анонимный тип

  • 2.0.0: аппроксимировать возвращаемый тип таких приватных inline-функций надтипом

Изменение поведения разрешения перегрузки: приоритет локальных вызовов функций-расширений над соглашениями invoke для свойств локального функционального типа

Задача: KT-37592

Компонент: Ядро языка

Тип несовместимого изменения: поведенческое

Цикл устаревания:

  • 2.0.0: новое поведение разрешения перегрузки; вызовы функций получают последовательный приоритет над соглашениями invoke

Выдача ошибки при конфликте унаследованных членов из-за изменения надтипа в бинарной зависимости

Задача: KT-51194

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.7.0: выдавать предупреждение CONFLICTING_INHERITED_MEMBERS_WARNING для объявлений, в которых возник конфликт унаследованных членов в надтипе из бинарной зависимости

  • 2.0.0: повысить уровень предупреждения до ошибки: CONFLICTING_INHERITED_MEMBERS

Игнорирование аннотаций @UnsafeVariance для параметров инвариантных типов

Задача: KT-57609

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: реализовать новое поведение; аннотация @UnsafeVariance игнорируется при выдаче ошибок о несовпадении типов в контравариантных параметрах

Изменение типа ссылок на член объекта-компаньона вне вызова

Задача: KT-54316

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.8.20: выдавать предупреждение для ссылки на функцию объекта-компаньона, тип которой выведен как несвязанная ссылка

  • 2.0.0: изменить поведение так, чтобы тип ссылок на функции объекта-компаньона выводился как тип связанных ссылок во всех контекстах использования

Запрет раскрытия анонимных типов из приватных inline-функций

Задача: KT-33917

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.3.0: выдавать предупреждение при вызове собственных членов анонимных объектов, возвращаемых приватными inline-функциями

  • 2.0.0: аппроксимировать возвращаемый тип таких приватных inline-функций надтипом и не разрешать вызовы членов анонимных объектов

Выдача ошибки при небезопасном smart cast после выхода из цикла while

Задача: KT-22379

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: реализовать новое поведение; прежнее поведение можно восстановить, переключившись на версию языка 1.9

Выдача ошибки при присваивании переменной типа-пересечения значения, не являющегося подтипом этого типа-пересечения

Задача: KT-53752

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: выдавать ошибку, если переменной типа-пересечения присваивается значение, не являющееся подтипом этого типа-пересечения

Требование opt-in, если интерфейс, созданный с помощью SAM-конструктора, содержит метод, требующий opt-in

Задача: KT-52628

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.7.20: выдавать предупреждение при использовании OptIn через SAM-конструктор

  • 2.0.0: повысить уровень предупреждения до ошибки при использовании OptIn через SAM-конструктор (или продолжать выдавать предупреждение, если уровень серьёзности маркера OptIn — предупреждение)

Запрет нарушения верхней границы в конструкторах typealias

Задача: KT-54066

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.8.0: выдавать предупреждение в случаях нарушения верхней границы в конструкторах typealias

  • 2.0.0: повысить уровень предупреждения до ошибки в компиляторе K2

Согласование фактического типа переменной деструктуризации с явно указанным типом

Задача: KT-57011

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: реализовать новое поведение; фактический тип переменной деструктуризации теперь согласуется с явно указанным типом

Требование opt-in при вызове конструктора с типами параметров, значения по умолчанию которых требуют opt-in

Задача: KT-55111

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.8.20: выдавать предупреждение при вызове конструкторов с типами параметров, требующими opt-in

  • 2.0.0: повысить уровень предупреждения до ошибки (или продолжать выдавать предупреждение, если уровень серьёзности маркера OptIn — предупреждение)

Выдача сообщения о неоднозначности между свойством и элементом перечисления с одинаковым именем на одном уровне области видимости

Задача: KT-52802

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.7.20: выдавать предупреждение, если компилятор выбирает свойство вместо элемента перечисления на том же уровне области видимости

  • 2.0.0: сообщать о неоднозначности, если компилятор K2 обнаруживает свойство и элемент перечисления с одинаковым именем на одном уровне области видимости (в старом компиляторе оставить предупреждение без изменений)

Изменение поведения разрешения квалификаторов: приоритет свойства объекта-компаньона над элементом перечисления

Задача: KT-47310

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: реализовать новое поведение разрешения; предпочтение отдаётся свойству объекта-компаньона, а не элементу перечисления

Разрешение типа получателя вызова invoke и типа функции invoke так, как если бы они были записаны в десахаризованной форме

Задача: KT-58260

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: разрешать тип получателя вызова invoke и тип функции invoke независимо, как если бы они были записаны в десахаризованной форме

Запрет раскрытия приватных членов класса через неприватные inline-функции

Задача: KT-55179

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.9.0: выдавать предупреждение PRIVATE_CLASS_MEMBER_FROM_INLINE_WARNING при вызове члена объекта-компаньона приватного класса из internal inline-функций

  • 2.0.0: повысить уровень этого предупреждения до ошибки PRIVATE_CLASS_MEMBER_FROM_INLINE

Исправление обнуляемости заведомо необнуляемых типов в проецированных обобщённых типах

Задача: KT-54663

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: реализовать новое поведение; в проецированных типах учитываются все не допускающие null типы, используемые непосредственно

Изменение выводимого типа префиксного инкремента: соответствие возвращаемому типу геттера вместо возвращаемого типа оператора inc()

Задача: KT-57178

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: реализовать новое поведение; выводимый тип префиксного инкремента изменяется и соответствует возвращаемому типу геттера вместо возвращаемого типа оператора inc()

Проверять ограничения при наследовании внутренних классов от обобщённых внутренних классов, объявленных в суперклассах

Проблема: KT-61749

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: сообщать об ошибке, если нарушено ограничение сверху параметра типа обобщённого внутреннего суперкласса

Запретить присваивание ссылок на вызываемые элементы с типами SAM, если ожидаемый тип — тип функции с параметром типа функции

Проблема: KT-64342

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: сообщать об ошибке компиляции для ссылок на вызываемые элементы с типами SAM, если ожидаемый тип — тип функции с параметром типа функции

Учитывать область видимости объекта-компаньона при разрешении аннотаций для объектов-компаньонов

Проблема: KT-64299

Компонент: Ядро языка

Тип несовместимого изменения: поведение

Цикл устаревания:

  • 2.0.0: реализовано новое поведение; область видимости объекта-компаньона больше не игнорируется при разрешении аннотаций для объектов-компаньонов

Изменить семантику вычисления сочетания безопасных вызовов и операторов-соглашений

Проблема: KT-41034

Компонент: Ядро языка

Тип несовместимого изменения: поведение

Цикл устаревания:

  • 1.4.0: сообщать о предупреждениях для каждого некорректного вызова

  • 2.0.0: реализовать новое поведение разрешения

Требовать немедленной инициализации свойств с резервным полем и пользовательским сеттером

Проблема: KT-58589

Компонент: Ядро языка

Тип несовместимого изменения: поведение

Цикл устаревания:

  • 1.9.20: выдавать предупреждение MUST_BE_INITIALIZED в случаях, когда первичный конструктор отсутствует

  • 2.0.0: повысить уровень предупреждения до ошибки

Запретить преобразование в Unit для произвольных выражений при вызове по соглашению оператора invoke

Проблема: KT-61182

Компонент: Ядро языка

Тип несовместимого изменения: поведение

Цикл устаревания:

  • 2.0.0: сообщать об ошибке, если преобразование в Unit применяется к произвольному выражению при разрешении переменной и вызова; используйте параметр компилятора -XXLanguage:+UnitConversionsOnArbitraryExpressions, чтобы сохранить предыдущее поведение для затронутых выражений.

Запретить присваивание значения nullable полю Java, не допускающему null, при обращении к полю через безопасный вызов

Проблема: KT-62998

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: сообщать об ошибке, если значение nullable присваивается полю Java, не допускающему null

Требовать тип со звёздной проекцией при переопределении метода Java, содержащего параметр типа raw

Проблема: KT-57600

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: реализовано новое поведение; переопределение запрещено для параметров типа raw

Изменить разрешение ссылки (V)::foo, если у V есть объект-компаньон

Проблема: KT-47313

Компонент: Ядро языка

Тип несовместимого изменения: поведение

Цикл устаревания:

  • 1.6.0: выдавать предупреждение для ссылок на вызываемые элементы, которые сейчас привязаны к экземплярам объектов-компаньонов

  • 2.0.0: реализовано новое поведение; добавление скобок вокруг типа больше не превращает его в ссылку на экземпляр объекта-компаньона этого типа

Запретить неявный доступ к непубличному API в фактически публичных inline-функциях

Проблема: KT-54997

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.8.20: сообщать о предупреждении компиляции при неявном доступе к непубличному API в публичных inline-функциях

  • 2.0.0: повысить уровень предупреждения до ошибки

Запретить аннотации use-site get для геттеров свойств

Проблема: KT-57422

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.9.0: выдавать предупреждение (ошибку в прогрессивном режиме) для аннотаций get с целью применения к геттерам

  • 2.0.0: повысить уровень предупреждения до ошибки INAPPLICABLE_TARGET_ON_PROPERTY; используйте -XXLanguage:-ProhibitUseSiteGetTargetAnnotations, чтобы заменить ошибку предупреждением

Запретить неявный вывод параметров типа в ограничения сверху в лямбда-функциях с выводом типов для построителей

Проблема: KT-47986

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.7.20: выдавать предупреждение (или ошибку в прогрессивном режиме), если параметр типа для аргумента типа невозможно вывести в объявленные ограничения сверху

  • 2.0.0: повысить уровень предупреждения до ошибки

Сохранять nullable-свойство при аппроксимации локальных типов в публичных сигнатурах

Проблема: KT-53982

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.8.0: гибкие типы аппроксимируются гибкими супертипами; выдавать предупреждение, если для объявления выводится тип, не допускающий null, хотя он должен быть nullable, предлагая явно указать тип во избежание исключений NullPointerException

  • 2.0.0: nullable-типы аппроксимируются nullable-супертипами

Убрать особую обработку false && ... и false || ... для смарт-приведения типов

Проблема: KT-65776

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 2.0.0: реализовано новое поведение; особая обработка false && ... и false || ... отсутствует

Запретить inline open-функции в перечислениях

Проблема: KT-34372

Компонент: Ядро языка

Тип несовместимого изменения: исходный код

Цикл устаревания:

  • 1.8.0: выдавать предупреждение для inline open-функций в перечислениях

  • 2.0.0: повысить уровень предупреждения до ошибки

Инструменты

Изменения видимости в Gradle

Проблема: KT-64653

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: Ранее некоторые функции и свойства Kotlin DSL, предназначенные для определённого контекста DSL, могли случайно становиться доступными в других контекстах DSL. Мы добавили аннотацию @KotlinGradlePluginDsl, которая предотвращает предоставление функций и свойств DSL плагина Kotlin Gradle на уровнях, где они не должны быть доступны. Следующие уровни разделены между собой:

  • Расширение Kotlin

  • Цель Kotlin

  • Компиляция Kotlin

  • Задача компиляции Kotlin

Цикл устаревания:

  • 2.0.0: в большинстве распространённых случаев компилятор выдаёт предупреждения с предложениями по исправлению ошибок при неправильной настройке сценария сборки; в противном случае компилятор сообщает об ошибке

Устаревание DSL kotlinOptions

Проблема: KT-63419

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: Возможность настраивать параметры компилятора через DSL kotlinOptions и связанный с ним интерфейс задачи KotlinCompile<KotlinOptions> устарела.

Цикл устаревания:

  • 2.0.0: выдать предупреждение

Устаревание compilerOptions в DSL KotlinCompilation

Проблема: KT-65568

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: Возможность настраивать свойство compilerOptions в DSL KotlinCompilation устарела.

Цикл устаревания:

  • 2.0.0: выдать предупреждение

Устаревание старых способов обработки CInteropProcess

Проблема: KT-62795

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: теперь задача CInteropProcess и класс CInteropSettings используют свойство definitionFile вместо defFile и defFileProperty.

Это устраняет необходимость добавлять дополнительные связи dependsOn между задачей CInteropProcess и задачей, которая генерирует defFile, если defFile создаётся динамически.

В проектах Kotlin/Native Gradle теперь отложенно проверяет наличие свойства definitionFile после выполнения связанной задачи на более позднем этапе процесса сборки.

Цикл устаревания:

  • 2.0.0: параметры defFile и defFileProperty устарели

  • 2.4.0: сообщать об ошибке для устаревшего свойства defFile

Удаление свойства Gradle kotlin.useK2

Проблема: KT-64379

Компонент: Gradle

Тип несовместимого изменения: поведение

Краткое описание: свойство Gradle kotlin.useK2 удалено. В Kotlin 1.9.* его можно было использовать для включения компилятора K2. В Kotlin 2.0.0 и более поздних версиях компилятор K2 включён по умолчанию, поэтому это свойство не влияет на работу и не позволяет вернуться к предыдущему компилятору.

Цикл устаревания:

  • 1.8.20: свойство Gradle kotlin.useK2 устарело

  • 2.0.0: свойство Gradle kotlin.useK2 удалено

Удаление устаревших идентификаторов плагинов платформ

Проблема: KT-65187

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: поддержка следующих идентификаторов плагинов платформ удалена:

  • kotlin-platform-android

  • kotlin-platform-jvm

  • kotlin-platform-js

  • org.jetbrains.kotlin.platform.android

  • org.jetbrains.kotlin.platform.jvm

  • org.jetbrains.kotlin.platform.js

Цикл устаревания:

  • 1.3: идентификаторы плагинов платформ устарели

  • 2.0.0: идентификаторы плагинов платформ больше не поддерживаются

Удаление параметра компилятора JavaScript outputFile

Проблема: KT-61116

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: параметр компилятора JavaScript outputFile удалён. Вместо него можно использовать свойство destinationDirectory задачи Kotlin2JsCompile, чтобы указать каталог для записи скомпилированных выходных файлов JavaScript.

Цикл устаревания:

  • 1.9.25: параметр компилятора outputFile устарел

  • 2.0.0: параметр компилятора outputFile удалён

2 июня 2026 г.
Что нового в Kotlin 2.0.0Что нового в Kotlin 1.9.20

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API