Kotlin 1.3 兼容性指南
保证语言的现代化 以及 语言版本升级平滑便利 是 Kotlin 语言设计时的基本原则之一. 第一条原则认为, 阻碍语言演进的那些元素应该删除, 后一条原则则认为, 这些删除必须事先与使用者良好沟通, 以便让源代码的迁移尽量平滑.
尽管语言的大多数变化都通过其他途径进行了通知, 比如每次更新时的变更日志, 以及编译器的警告信息, 但我们还是在本文档中对这些变化进行一个总结, 提供一个 Kotlin 1.2 从迁移到 Kotlin 1.3 时的完整的参考列表.
基本术语
在本文档中, 我们介绍几种类型的兼容性:
源代码级兼容性: 源代码级别的不兼容会导致过去能够正确编译(没有错误和警告)的代码变得不再能够编译
二进制级兼容性: 如果交换两个二进制库文件, 不会导致程序的装载错误, 或链接错误, 那么我们称这两个文件为二进制兼容
行为级兼容性: 如果在某个变更发生之前和之后, 程序表现出不同的行为, 那么这个变更称为行为不兼容
请记住, 这些兼容性定义只针对纯 Kotlin 程序. 从其他语言(比如, Java)的观点来看 Kotlin 代码的兼容性如何, 本文档不予讨论.
不兼容的变化
调用 <clinit>
时的构造器参数计算顺序
注解的构造器参数的属性取值方法的注解丢失问题
类构造器的 @get:
注解的错误丢失问题
访问 @NotNull
注解标注的 Java 类型时的可空性断言
对枚举类成员的智能类型转换不正确
在取值方法中对val
型属性的后端域变量再次赋值
在对数组的 for
循环之前捕获数组
枚举值内的嵌套类型
数据类覆盖 copy
方法
继承 Throwable
的内部类从外部类中捕获泛型参数
对于带有同伴对象的复杂的类继承的可见度规则
常数以外的 vararg 注解参数
局部的注解类
mod
运算符规约
以命名参数的形式向 vararg 传递单个值
目标为 EXPRESSION
的注解的 retention 设置
目标为 PARAMETER
的注解不应该用在参数的类型上
当下标越界时 Array.copyOfRange
抛出异常, 而不是扩大返回的数组大小
步长(step)为 Int.MIN_VALUE
和 Long.MIN_VALUE
的整数和长整数的数列(progression)会被判定为非法, 并禁止创建
对非常长的序列的操作中, 检查下标溢出
使用没有匹配结果的正规表达式来切分字符串时, 在各个平台上得到一致的结果
stdlib 中的注解
最终更新: 2024/10/17