Scala 3 迁移指南

不兼容性表

语言

不兼容性是指可以用 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 宏。

您可以返回 元编程 页面以了解新的元编程特性。

此页面的贡献者