Kotlin 语言参考文档 中文版 Help

Kotlin 1.4 兼容性指南

保证语言的现代化 以及 语言版本升级平滑便利 是 Kotlin 语言设计时的基本原则之一. 第一条原则认为, 阻碍语言演进的那些元素应该删除, 后一条原则则认为, 这些删除必须事先与使用者良好沟通, 以便让源代码的迁移尽量平滑.

尽管语言的大多数变化都通过其他途径进行了通知, 比如每次更新时的变更日志, 以及编译器的警告信息, 但我们还是在本文档中对这些变化进行一个总结, 提供一个 Kotlin 1.3 从迁移到 Kotlin 1.4 时的完整的参考列表.

基本术语

在本文档中, 我们介绍几种类型的兼容性:

  • 源代码级兼容性: 源代码级别的不兼容会导致过去能够正确编译(没有错误和警告)的代码变得不再能够编译

  • 二进制级兼容性: 如果交换两个二进制库文件, 不会导致程序的装载错误, 或链接错误, 那么我们称这两个文件为二进制兼容

  • 行为级兼容性: 如果在某个变更发生之前和之后, 程序表现出不同的行为, 那么这个变更称为行为不兼容

请记住, 这些兼容性定义只针对纯 Kotlin 程序. 从其他语言(比如, Java)的观点来看 Kotlin 代码的兼容性如何, 本文档不予讨论.

语言与标准库

ConcurrentHashMap 和 in 中缀操作符的不正常行为

禁止访问 public inline 成员之内的 protected 成员

带隐含接受者的调用的契约(Contract)

浮点数比较的行为不一致

在泛型 Lambda 表达式中, 最后一条表达式没有智能类型转换

不再根据 Lambda 表达式参数的顺序将类型强制解释为 Unit

raw 和 integer 字面类型的共通超类型错误, 导致代码错误

类型安全性问题: 几个相等类型的变量被初始化为不同的类型

类型安全性问题: 对于类型交集, 子类型不正确

在 Lambda 表达式之内的空 when 表达式没有类型不匹配

如果 Lambda 表达式可能的返回值之一是使用 integer 字面类型的快速返回, 推断的 Lambda 表达式返回类型为 Any

正确的捕捉带递归类型的星号投射(star projection)

不完整类型(non-proper type)与灵活类型(flexible type)的共通超类型计算导致错误的结果

类型安全性问题: 可 null 的类型参数未能正确转换为捕获的类型

对协变(covariant)类型, 在未检测的类型转换之后, 保留交叉类型(intersection type)

使用 this 表达式导致构造器推断中缺少类型变量

对带有可 null 类型参数的反向类型变异(contravariant)类型的 overload 解析结果错误

带有非嵌套的递归约束的构造器推断

类型变量的固定在及早计算(eager)模式下会导致矛盾的约束系统

对 open 函数禁止使用 tailrec 标识符

同伴对象的 INSTANCE 域可见度超过同伴对象的类本身

插入在 return 之前的外层 finally 代码段, 没有从不带 finally 的内层 try 代码段的 catch 分支中排除

对协变(covariant)和泛型专用的(generic-specialized)覆盖, 在返回类型位置的内联类(inline class)会使用装箱(box)版本

委托到 Kotlin 接口时, 在 JVM 字节码中不声明受控异常(Checked Exception)

对于带有单个不定数量参数(vararg parameter)的方法, 签名多态(signature-polymorphic)调用的行为有变化, 以避免将参数包装入另一个数组

当 KClass 用作泛型参数时, 注解中的泛型签名错误

在签名多态(signature-polymorphic) 调用中禁止展开(spread)

对尾递归(tail-recursive)优化函数, 默认值的初始化顺序变更

对非 const 的 val, 不生成 ConstantValue 属性

对 open 方法上的 @JvmOverloads 生成的 overload 应该是 final

返回 kotlin.Result 的 Lambda 表达式, 现在会返回装箱(box)的值, 而不是未装箱(unbox)的值

统一 null 检查的相关异常

在 array/list 的 contains, indexOf, lastIndexOf 操作中的浮点值比较: 使用 IEEE 754 标准还是全顺序(total order)标准

将集合的 min 和 max 函数返回类型逐渐改变为非 null

废弃 appendln, 改为使用 appendLine

废弃浮点类型向 Short 和 Byte 的转换

在 Regex.findAll 中使用不正确的 startIndex 时快速失败

删除废弃的 kotlin.coroutines.experimental

删除废弃的 mod 操作符

隐藏 Throwable.addSuppressed 成员函数, 改为使用扩展函数

capitalize 应该将二合字母(Digraph)转换为标题格式(title case)

工具

在 Windows 上, 带分隔字符的编译器参数必须使用双引号括起

KAPT: 属性的合成 $annotations() 方法名称有变化

最终更新: 2024/12/17