Skip to content

Kotlin 1.7.20 兼容性指南

保持语言现代化舒适的更新 是 Kotlin 语言设计的_基本原则_。前者指出应移除阻碍语言演进的构造,后者则强调应事先充分沟通此移除,以使代码迁移尽可能顺利。

通常,不兼容变更仅在功能版本发布中发生,但本次我们不得不在一个增量版本中引入两项此类变更,以限制 Kotlin 1.7 变更所带来的问题蔓延。

本文总结了这些变更,为从 Kotlin 1.7.0 和 1.7.10 迁移到 Kotlin 1.7.20 提供参考。

基本术语

本文中,我们介绍了以下几种兼容性:

  • :源不兼容变更指使原本能够正常编译(无错误或警告)的代码无法再编译
  • 二进制:如果两个二进制产物互相替换不会导致加载或链接错误,则称它们是二进制兼容的
  • 行为:如果同一程序在应用变更前后表现出不同的行为,则称该变更是行为不兼容的

请记住,这些定义仅适用于纯 Kotlin。从其他语言(例如 Java)角度来看的 Kotlin 代码兼容性不在本文讨论范围之内。

语言

回滚尝试以修复正确的约束处理

Issue: KT-53813

组件:核心语言

不兼容变更类型:源

简述:回滚了在 1.7.0 中实现 KT-52668 所述变更后,针对类型推断约束处理中出现的问题的修复尝试。该尝试在 1.7.10 中进行,但反过来又引入了新问题。

弃用周期

  • 1.7.20:回滚到 1.7.0 行为

禁止某些构建器推断情况以避免与多重 Lambda 和解析产生问题交互

Issue: KT-53797

组件:核心语言

不兼容变更类型:源

简述:Kotlin 1.7 引入了一项名为无限制构建器推断(unrestricted builder inference)的功能,即使是传递给未用 @BuilderInference 注解的参数的 lambda 表达式也可以从构建器推断中受益。然而,如果函数调用中出现多个此类 lambda 表达式,则可能导致一些问题。

如果有多个 lambda 函数,其对应参数未用 @BuilderInference 注解,并且需要使用构建器推断来完成 lambda 中的类型推断,那么 Kotlin 1.7.20 将会报告错误。

弃用周期

  • 1.7.20:对此类 lambda 函数报告错误,-XXLanguage:+NoBuilderInferenceWithoutAnnotationRestriction 可用于暂时恢复到 1.7.20 之前的行为