升级Scala2.12到Scala3
内容提要
本文介绍了作者尝试将自己的Scala2.12项目升级到Scala3的过程。作者提到了升级的思路和具体步骤,以及遇到的一些错误和警告。作者还对一些类型定义和约束的变化进行了讨论。最后,作者提到了一些数据类型转换的警告和方法的废弃问题。
延伸解读
升级策略:隔离与依赖调整
作者采用复制项目目录并重命名的方式,避免影响原项目,同时修改artifact名称追加“-scala3”以区分依赖。在Maven中更新scala-maven-plugin和scala3-library依赖,这是升级的第一步。这种隔离策略便于回滚和对比,适合尝试性升级。
主要破坏性变更:语法与类型
升级中遇到的错误包括:Unit方法必须使用“=”定义;类型转换更严格,如Int到Double需显式转换;方法调用必须加括号,否则被视为方法引用。这些变化要求代码更显式,减少了隐式转换的便利性,但提高了安全性。
通配符与变量初始化的调整
类型通配符从“_”变为“?”,如Worker[_]改为Worker[?]。变量通配符初始化从“var x: T = _”改为“var x: T = uninitialized”,并需导入scala.compiletime.uninitialized。作者认为这是倒退,更倾向于使用null。这些改动增加了迁移成本。
弃用警告与替代方案
JavaConverters被弃用,建议使用scala.jdk.CollectionConverters;Long到Double的隐式转换因精度丢失被弃用,应使用.toDouble;lineStream_!被弃用,建议使用lazyLines_!。这些警告提示开发者更新代码以符合新标准,避免未来移除风险。
Q&A
如何将Scala2.12项目升级到Scala3?
可以通过复制项目目录、修改artifact名称和更新maven依赖配置来升级。
在升级过程中遇到了哪些主要错误?
主要错误包括Unit方法必须使用'=',类型转换和方法调用变得更严格。
Scala3中类型转换有什么变化?
Scala3中类型转换更严格,要求将Int转换为Double,并且隐式转换被认为不安全。
Scala3中方法调用的要求是什么?
方法调用必须加括号,不能省略,否则会被认为是方法引用。
Scala3中通配符的使用有什么变化?
通配符的使用从'_'变为'?',例如T[_<:S]变为T[?<:S]。
在Scala3中,如何处理集合类型转换?
建议使用scala.jdk.CollectionConverters替代已弃用的JavaConverters。