Spec-Zone.ru › Kotlin 1.9
Руководство по совместимости для Kotlin 1.4 Поддержание актуальности языка и Комфортные обновления являются основополагающими принципами при разработке языка Kotlin. Первый принцип гласит, что конструкции, препятствующие развитию языка, должны быть удалены, а второй – что об этом удалении следует заранее сообщить, чтобы минимизировать трудности при миграции кода.
Хотя большинство изменений языка уже были объявлены в других каналах, таких как журналы обновлений или предупреждения компилятора, этот документ обобщает все эти изменения, предоставляя полную справку по миграции с Kotlin 1.3 на Kotlin 1.4.
Основные термины
В этом документе мы вводим несколько типов совместимости:
исходный код : изменение, несовместимое с исходным кодом, препятствует компиляции кода, который раньше успешно компилировался (без ошибок или предупреждений).
бинарный : два бинарных артефакта считаются бинарно совместимыми, если их обмен не приводит к ошибкам загрузки или компоновки.
поведенческий : изменение считается поведенчески несовместимым, если одно и то же приложение демонстрирует различное поведение до и после применения этого изменения.
Обратите внимание, что эти определения приведены только для чистого Kotlin. Совместимость кода Kotlin с точки зрения других языков (например, Java) выходит за рамки этого документа.
Язык и стандартная библиотека
Непредвиденное поведение оператора in и ConcurrentHashMap
Проблема : KT-18053
Компонент : Язык Kotlin
Тип изменения несовместимости : исходный код
Краткое описание : Kotlin 1.4 запретит автоматический оператор contains, исходящий от разработчиков java.util.Map, написанных на Java
Цикл устаревания :
< 1.4: вывод предупреждения для проблемных операторов в месте вызова
>= 1.4: это предупреждение будет переведено в ошибку, -XXLanguage:-ProhibitConcurrentHashMapContains может быть использован для временного возврата к поведению до 1.4
Запрет доступа к защищенным членам внутри публичных встроенных членов
Проблема : KT-21178
Компонент : Язык Kotlin
Тип изменения несовместимости : исходный код
Краткое описание : Kotlin 1.4 запретит доступ к защищенным членам из публичных встроенных членов.
Цикл устаревания :
< 1.4: вывод предупреждения в месте вызова для проблемных случаев
1.4: это предупреждение будет переведено в ошибку, -XXLanguage:-ProhibitProtectedCallFromInline может быть использован для временного возврата к поведению до 1.4
Договоры о вызовах с неявными получателями
Проблема : KT-28672
Компонент : Язык Kotlin
Тип изменения несовместимости : поведенческий
Краткое описание : в 1.4 станут доступны интеллектуальные преобразования типов на основе договоров для вызовов с неявными получателями
Цикл устаревания :
< 1.4: старое поведение (подробнее в проблеме)
>= 1.4: поведение изменилось, -XXLanguage:-ContractsOnCallsWithImplicitReceiver может быть использован для временного возврата к поведению до 1.4
Несогласованное поведение сравнений чисел с плавающей точкой
Проблемы : KT-22723
Компонент : Язык Kotlin
Тип изменения несовместимости : поведенческий
Краткое описание : начиная с Kotlin 1.4, компилятор Kotlin будет использовать стандарт IEEE 754 для сравнения чисел с плавающей точкой
Цикл устаревания :
< 1.4: старое поведение (подробнее в проблеме)
>= 1.4: поведение изменилось, -XXLanguage:-ProperIeee754Comparisons может быть использован для временного возврата к поведению до 1.4
Отсутствие интеллектуального преобразования типа для последнего выражения в обобщенном лямбда-выражении
Проблема : KT-15020
Компонент : Язык Kotlin
Тип изменения несовместимости : поведенческий
Краткое описание : интеллектуальные преобразования для последних выражений в лямбда-выражениях будут корректно применяться с 1.4
Цикл устаревания :
< 1.4: старое поведение (подробнее в проблеме)
>= 1.4: поведение изменилось, -XXLanguage:-NewInference может быть использован для временного возврата к поведению до 1.4. Обратите внимание, что этот флаг также отключит несколько новых языковых функций.
Не полагайтесь на порядок аргументов лямбда-выражений для принудительного преобразования результата к Unit
Проблема : KT-36045
Компонент : Язык Kotlin
Тип изменения несовместимости : исходный код
Краткое описание : начиная с Kotlin 1.4, аргументы лямбда-выражений будут обрабатываться независимо без неявного принудительного преобразования к Unit
Цикл устаревания :
< 1.4: старое поведение (подробнее в проблеме)
>= 1.4: поведение изменилось, -XXLanguage:-NewInference может быть использован для временного возврата к поведению до 1.4. Обратите внимание, что этот флаг также отключит несколько новых языковых функций.
Неверный общий супертип между сырым и целочисленным литеральным типом приводит к некорректной работе кода
Проблема : KT-35681
Компоненты : Язык Kotlin
Тип изменения несовместимости : исходный код
Краткое описание : начиная с Kotlin 1.4, общий супертип между сырым Comparable типом и целочисленным литеральным типом будет более специфичным
Цикл устаревания :
< 1.4: старое поведение (подробнее в проблеме)
>= 1.4: поведение изменилось, -XXLanguage:-NewInference может быть использован для временного возврата к поведению до 1.4. Обратите внимание, что этот флаг также отключит несколько новых языковых функций.
Проблема безопасности типов, из-за того, что несколько одинаковых переменных типа инициализируются разными типами
Проблема : KT-35679
Компонент : Язык Kotlin
Тип изменения несовместимости : исходный код
Краткое описание : начиная с Kotlin 1.4, компилятор Kotlin запретит инициализацию одинаковых переменных типа разными типами
Цикл устаревания :
< 1.4: старое поведение (подробнее в проблеме)
>= 1.4: поведение изменилось, -XXLanguage:-NewInference может быть использован для временного возврата к поведению до 1.4. Обратите внимание, что этот флаг также отключит несколько новых языковых функций.
Проблема безопасности типов из-за неправильного подтипирования для пересекающихся типов
Проблемы : KT-22474
Компонент : Язык Kotlin
Тип изменения несовместимости : исходный код
Краткое описание : в Kotlin 1.4 подтипирование для пересекающихся типов будет уточнено для более корректной работы
Цикл устаревания :
< 1.4: старое поведение (подробнее в проблеме)
>= 1.4: поведение изменилось, -XXLanguage:-NewInference может быть использован для временного возврата к поведению до 1.4. Обратите внимание, что этот флаг также отключит несколько новых языковых функций.
Отсутствие несовпадения типов с пустым выражением when внутри лямбда-выражения
Проблема : KT-17995
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, произойдет несовпадение типов для пустого выражения when , если оно используется в качестве последнего выражения в лямбда-выражении
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Тип возврата Any выведен для лямбда-выражения с ранним возвратом с целочисленной литералом в одном из возможных значений возврата
Проблема : KT-20226
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, тип целого числа, возвращаемого из лямбда-выражения, будет более конкретным в случаях, когда используется ранний возврат
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Правильное захват звёздных проекций с рекурсивными типами
Проблема : KT-33012
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, больше кандидатов станет применимыми, так как захват для рекурсивных типов будет работать более правильно
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Вычисление общего супертипа с ненадлежащим типом и гибким типом приводит к неправильным результатам
Проблема : KT-37054
Компонент : Язык Kotlin
Тип несовместимого изменения : поведенческий
Краткое описание : начиная с Kotlin 1.4, общий супертип между гибкими типами будет более конкретным, защищая от ошибок во время выполнения
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Проблема безопасности типов из-за отсутствия захваченного преобразования против аргумента типа null
Проблема : KT-35487
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, подтипизация между захваченными и nullable типами будет более корректной, защищая от ошибок во время выполнения
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Сохранение пересечения типов для ковариативных типов после неявного приведения
Проблема : KT-37280
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, неявные приведения ковариативных типов создают пересечение типов для интеллектуальных приведений, а не тип неявного приведения.
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Утечка переменных типа из вывода билдера из-за использования выражения this
Проблема : KT-32126
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, использование this внутри функций-билдеров, таких как sequence {}, запрещено, если нет других надлежащих ограничений
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Неправильное разрешение перегрузки для контравариантных типов с аргументами типа null
Проблема : KT-31670
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, если две перегрузки функции, принимающей контравариантные типы аргументов, различаются только по возможности null аргумента (например, In<T> и In<T?>), тип null считается более конкретным.
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Выведение типа билдера с невложенными рекурсивными ограничениями
Проблема : KT-34975
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, функции-билдера, такие как sequence {}, с типом, зависящим от рекурсивного ограничения внутри переданного лямбда-выражения, вызывают ошибку компилятора.
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Принудительное закрепление переменных типов приводит к противоречивой системе ограничений
Проблема : KT-25175
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, вычисление типа в определенных случаях работает менее активно, что позволяет найти систему ограничений, которая не является противоречивой.
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-NewInference можно использовать для временного возврата к поведению до версии 1.4. Обратите внимание, что этот флаг также отключит несколько новых функций языка.
Запрет модификатора tailrec на открытых функциях
Проблема : KT-18541
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, функции не могут иметь модификаторы open и tailrec одновременно.
Цикл устаревания :
< 1.4: выводится предупреждение о функциях, имеющих модификаторы open и tailrec вместе (ошибка в прогрессивном режиме).
>= 1.4: данное предупреждение повышается до ошибки.
Поле INSTANCE компаньон-объекта более видимое, чем сам компаньон-объект
Проблема : KT-11567
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : начиная с Kotlin 1.4, если компаньон-объект является приватным, то его поле INSTANCE также будет приватным.
Цикл устаревания :
Вложенный блок finally, вставленный перед return, не исключается из интервала catch внутреннего блока try без finally
Проблема : KT-31923
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4, интервал catch будет правильно вычисляться для вложенных блоков try/catch
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-ProperFinally можно использовать для временного возврата к поведению до версии 1.4
Использование упакованной версии встроенного класса в позиции возвращаемого типа для ковариантных и обобщенных специализированных переопределений
Проблемы : KT-30419
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : начиная с Kotlin 1.4, функции, использующие ковариантные и обобщенные специализированные переопределения, будут возвращать упакованные значения встроенных классов.
Цикл устаревания :
Не объявляйте обработчики исключений в байт-коде JVM при делегировании на Kotlin-интерфейсы
Проблема : KT-35834
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.4 не будет генерировать обработчики исключений во время делегирования на Kotlin-интерфейсы.
Цикл устаревания :
< 1.4: старое поведение (см. подробности в проблеме)
>= 1.4: поведение изменено, -XXLanguage:-DoNotGenerateThrowsForDelegatedKotlinMembers можно использовать для временного возврата к поведению до версии 1.4
Измененное поведение полиморфных вызовов сигнатур к методам с единственным параметром vararg для избежания обертывания аргумента в другой массив
Проблема : KT-35469
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.4 не будет обертывать аргумент в другой массив при полиморфном вызове сигнатуры.
Цикл устаревания :
Неправильная обобщенная подпись в аннотациях при использовании KClass в качестве обобщенного параметра
Проблема : KT-35207
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.4 исправит неправильное сопоставление типов в аннотациях при использовании KClass в качестве обобщенного параметра.
Цикл устаревания :
Запрещение использования оператора spread в вызовах с подписью-полиморфизмом
Задача : KT-35226
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.4 запретит использование оператора spread (*) в вызовах с подписью-полиморфизмом
Цикл устаревания :
< 1.4: выводит предупреждение при использовании оператора spread в вызовах с подписью-полиморфизмом
>= 1.5: преобразует это предупреждение в ошибку, -XXLanguage:-ProhibitSpreadOnSignaturePolymorphicCall может быть использован для временного возврата к поведению версии до 1.4
Изменение порядка инициализации значений по умолчанию для оптимизированных хвостовых рекурсивных функций
Задача : KT-31540
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : С Kotlin 1.4 порядок инициализации для хвостовых рекурсивных функций будет таким же, как и для обычных функций.
Цикл устаревания :
< 1.4: выводит предупреждение на этапе объявления для проблемных функций
>= 1.4: поведение изменилось, -XXLanguage:-ProperComputationOrderOfTailrecDefaultParameters может быть использован для временного возврата к поведению версии до 1.4
Не генерировать атрибут ConstantValue для non-const vals
Задача : KT-16615
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческое
Краткое описание : С Kotlin 1.4 компилятор не будет генерировать атрибут ConstantValue для не-const val.
Цикл устаревания :
< 1.4: выводит предупреждение через проверку в IntelliJ IDEA
>= 1.4: поведение изменилось, -XXLanguage:-NoConstantValueAttributeForNonConstVals может быть использован для временного возврата к поведению версии до 1.4
Сгенерированные перегрузки для @JvmOverloads на открытых методах должны быть final
Задача : KT-33240
Компоненты : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : перегрузки для функций с @JvmOverloads будут генерироваться как final
Цикл устаревания :
< 1.4: старое поведение (см. подробности в задаче)
>= 1.4: поведение изменилось, -XXLanguage:-GenerateJvmOverloadsAsFinal может быть использован для временного возврата к поведению версии до 1.4
Лямбды, возвращающие 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. -Xno-unified-null-checks может быть использован для временного возврата к поведению версии до 1.4
Сравнение значений с плавающей точкой в операциях массива/списка contains, indexOf, lastIndexOf: IEEE 754 или общий порядок
Задача : KT-28753
Компонент : kotlin-stdlib (JVM)
Тип несовместимого изменения : поведенческое
Краткое описание : реализация List возвращаемая из Double/FloatArray.asList() будет реализовывать contains, indexOf, и lastIndexOf, чтобы они использовали полное порядковое равенство.
Цикл устаревания :
Постепенное изменение типа возвращаемого значения функций min и max для коллекций на non-nullable
Задача : KT-38854
Компонент : kotlin-stdlib (JVM)
Тип несовместимого изменения : исходный код
Краткое описание : тип возвращаемого значения функций min и max для коллекций будет изменен на non-nullable в версии 1.6.
Цикл устаревания :
1.4: вводятся функции ...OrNull в качестве синонимов и устаревание затронутого API (см. подробности в задаче)
1.5.x: повышение уровня устаревания затронутого API до ошибки
>=1.6: повторное введение затронутого API, но с типом возврата non-nullable
Устаревание 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, устаревший kotlin.coroutines.experimental API удален из 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
Тип несовместимого изменения : поведенческое
Краткое описание : имена синтетических $annotations() методов, сгенерированных KAPT для свойств, изменились в 1.4
Цикл устаревания :
< 1.4: имена синтетических $annotations() методов для свойств следуют шаблону <propertyName>@annotations()
>= 1.4: имена синтетических $annotations() методов для свойств включают префикс get: get<PropertyName>@annotations()
Последнее изменение: 14 декабря 2021 г.