13.6.7.3 Kotlin 1.7.20 兼容性指南

原文链接: https://kotlinlang.org/docs/compatibility-guide-1720.html

13.6.7.3 Kotlin 1.7.20 兼容性指南

保持语言现代性 和 平滑升级 是 Kotlin 语言设计的基本原则。前者指出,阻碍语言演进的构造应当被移除;后者指出,这种移除应当事先充分沟通,以便代码迁移尽可能顺畅。

通常不兼容的变更只发生在功能版本中,但这一次我们必须在增量版本中引入两项此类变更,以限制 Kotlin 1.7 中的变更所引发问题的扩散范围。

本文对它们进行了汇总,为从 Kotlin 1.7.0 和 1.7.10 迁移到 Kotlin 1.7.20 提供参考。

基本术语

本文介绍几种兼容性:

  • 源码(source):源码不兼容的变更会让原本能正常编译(没有错误或警告)的代码无法再编译
  • 二进制(binary):如果互换两个二进制构件不会导致加载或链接错误,就称它们是二进制兼容的
  • 行为(behavioral):如果同一个程序在应用变更前后表现出不同行为,就称该变更是行为不兼容的

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

语言

回滚修复约束处理方式的尝试

问题:KT-53813 组件:核心语言 不兼容变更类型:源码 简要说明:回滚一次修复类型推断约束处理问题的尝试,该问题在 1.7.0 中实现 KT-52668 描述的变更后出现。这次尝试是在 1.7.10 中进行的,但它又引入了新的问题。 弃用周期:- 1.7.20:回滚到 1.7.0 的行为

禁止某些构建器推断场景,以避免与多个 lambda 及解析的冲突

问题:KT-53797 组件:核心语言 不兼容变更类型:源码 简要说明:Kotlin 1.7 引入了一项称为无限制构建器推断的特性,因此即使传给未标注 @BuilderInference 的参数的 lambda,也能从构建器推断中受益。然而,如果一次函数调用中出现多个这样的 lambda,就可能引发若干问题。Kotlin 1.7.20 将报告错误:如果有多个 lambda 函数对应的参数未标注 @BuilderInference,却需要使用构建器推断才能完成 lambda 中类型的推断。 弃用周期:- 1.7.20:对这类 lambda 函数报告错误,可以使用 -XXLanguage:+NoBuilderInferenceWithoutAnnotationRestriction 暂时回退到 1.7.20 之前的行为