Kotlin 1.7.20 兼容性指南
最终更新: 2025/02/06保证语言的现代化 以及 语言版本升级平滑便利 是 Kotlin 语言设计时的基本原则之一. 第一条原则认为, 阻碍语言演进的那些元素应该删除, 后一条原则则认为, 这些删除必须事先与使用者良好沟通, 以便让源代码的迁移尽量平滑.
不兼容的变更通常只出现在功能发布版中, 但这一次, 我们不得不在一个增量发布版中引入了 2 个这样的变更, 以便尽早解决由 Kotlin 1.7 的变更造成的一些问题.
本文档概述这些问题, 提供关于 Kotlin 1.7.0 和 1.7.10 向 Kotlin 1.7.20 迁移的参考.
基本术语
在本文档中, 我们介绍几种类型的兼容性:
源代码级兼容性: 源代码级别的不兼容会导致过去能够正确编译(没有错误和警告)的代码变得不再能够编译
二进制级兼容性: 如果交换两个二进制库文件, 不会导致程序的装载错误, 或链接错误, 那么我们称这两个文件为二进制兼容
行为级兼容性: 如果在某个变更发生之前和之后, 程序表现出不同的行为, 那么这个变更称为行为不兼容
请记住, 这些兼容性定义只针对纯 Kotlin 程序. 从其他语言(比如, Java)的观点来看 Kotlin 代码的兼容性如何, 本文档不予讨论.
语言
回滚了对约束处理的修正
tip
禁止某些构建器推断情况, 以避免与多个 Lambda 表达式和解析之间的有问题的互动
tip
Issue: KT-53797
组件: 核心语言
不兼容性类型: 源代码级
概述: Kotlin 1.7 引入了一个功能特性, 称为无限制的构建器推断, 使得即使传递给参数的 Lambda 表达式没有标注
@BuilderInference
注解, 也可以利用构建器推断功能. 但是, 如果在函数调用中出现多个这样的 Lambda 表达式, 可能导致几种问题.如果多个 Lambda 函数对应的参数没有标注
@BuilderInference
注解, 而且在 Lambda 表达式内要求使用构建器推断来完成类型推断, Kotlin 1.7.20 会对这样的情况报告编译错误.废弃周期:
1.7.20: 对这样的Lambda 函数报告编译错误, 可以使用
-XXLanguage:+NoBuilderInferenceWithoutAnnotationRestriction
来临时退回到 1.7.20 以前的行为.