Kotlin 语言参考文档 中文版 Help

Kotlin 1.4 兼容性指南

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

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

基本术语

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

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

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

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

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

语言与标准库

ConcurrentHashMapin 中缀操作符的不正常行为

禁止访问 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)优化函数, 默认值的初始化顺序变更

对非 constval, 不生成 ConstantValue 属性

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

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

统一 null 检查的相关异常

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

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

废弃 appendln, 改为使用 appendLine

废弃浮点类型向 ShortByte 的转换

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

删除废弃的 kotlin.coroutines.experimental

删除废弃的 mod 操作符

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

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

工具

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

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

最终更新: 2024/10/17