不兼容性是指可以用 Scala 2.13 编译但不能用 Scala 3 编译的代码片段。迁移代码库涉及查找并修复源代码的所有不兼容性。在极少数情况下,我们也可能遇到运行时不兼容性:在运行时表现不同的代码片段。
在此页面中,我们提出了已知不兼容性的分类。每个不兼容性由以下内容描述
- 其简称,带有指向详细描述和建议解决方案的链接
- Scala 2.13 编译器是否发出弃用警告或功能警告
- 是否存在 Scala 3 迁移 规则
- 是否存在可以修复它的 Scalafix 规则
Scala 2.13 弃用和功能警告
使用
-Xsource:3
运行 2.13 编译以定位代码中的这些不兼容性。
Scala 3 迁移与 Scalafix 重写
Scala 3 迁移模式开箱即用。相反,Scalafix 是必须手动安装和配置的工具。但是 Scalafix 有其自身的优势
- 它在 Scala 2.13 上运行。
- 它由可以一次应用一条的各个规则组成。
- 通过添加自定义规则可以轻松扩展它。
语法更改
一些旧语法不再受支持。
不兼容性 | Scala 2.13 | Scala 3 迁移重写 | Scalafix 规则 |
---|---|---|---|
受限关键字 | ✅ | ||
过程语法 | 弃用 | ✅ | ✅ |
lambda 参数周围的括号 | ✅ | ||
传递参数时的大括号缩进 | ✅ | ||
错误缩进 | |||
_ 作为类型参数 |
|||
+ 和 - 作为类型参数 |
已删除功能
为了简化语言,一些功能已被删除。
不兼容性 | Scala 2.13 | Scala 3 迁移重写 | Scalafix 规则 |
---|---|---|---|
符号文字 | 弃用 | ✅ | |
do -while 构造 |
✅ | ||
自动应用 | 弃用 | ✅ | ✅ |
值 eta 扩展 | 弃用 | ✅ | ✅ |
any2stringadd 转换 |
弃用 | ✅ | |
早期初始化器 | 弃用 | ||
存在类型 | 功能警告 |
上下文抽象
上下文抽象 的重新设计带来了一些明确的不兼容性。
不兼容性 | Scala 2.13 | Scala 3 迁移重写 | Scalafix 规则 | 运行时不兼容性 |
---|---|---|---|---|
隐式 def 的类型 | ✅ | |||
隐式视图 | 可能 | |||
视图边界 | 弃用 | |||
对 A 和 => A 的模棱两可的转换 |
此外,我们已经更改了隐式解析规则,以便它们更有用,并且不会令人惊讶。新规则在此处进行了描述 here。
由于这些更改,Scala 3 编译器可能会无法解析现有 Scala 2.13 代码的一些隐式参数。
其他已更改功能
为了使语言更简单、更安全或更一致,一些其他功能已得到简化或限制。
不兼容性 | Scala 3 迁移重写 |
---|---|
继承阴影 | ✅ |
私有类中的非私有构造函数 | 迁移警告 |
抽象重写 | |
案例类伴生对象 | |
显式调用 unapply | |
不可见的 bean 属性 | |
=>T 作为类型参数 |
|
通配符类型参数 |
类型检查器
Scala 2.13 类型检查器在某些特定情况下不健全。这可能会导致我们在意想不到的地方出现令人惊讶的运行时错误。Scala 3 基于更强大的理论基础,现在已修复类型检查器中的这些不健全错误。
不兼容性 |
---|
方差检查 |
模式匹配 |
类型推断
Scala 2.13 和 Scala 3 之间更改了一些特定的类型推断规则。
不兼容性 |
---|
重写方法的返回类型 |
反射类型 |
此外,我们通过完全重新设计改进了类型推断算法。这种根本性的改变导致了一些不兼容性
- 可以推断出不同的类型
- 可能会出现新的类型检查错误
始终建议显式编写所有公共值和方法的结果类型。它可以防止库的公共 API 由于推断出的类型不同而随 Scala 版本而更改。
在 Scala 3 迁移之前,可以使用 Scalafix 中的 ExplicitResultTypes 规则来完成此操作。
宏
Scala 3 编译器无法扩展 Scala 2.13 宏。在这种情况下,有必要使用新的 Scala 3 元编程特性重新实现 Scala 2.13 宏。
您可以返回 元编程 页面以了解新的元编程特性。