摘自“Scala with cats”(第 18 页):
隐式转换
当您使用隐式 def 创建类型类实例构造函数时,请务必将该方法的参数标记为隐式参数。如果没有这个关键字,编译器将无法在隐式解析期间填充参数。具有非隐式参数的方法形成了一种不同的 Scala 模式,称为隐式转换。这也与上一节有关接口语法的不同,因为在这种情况下,implicit
是一个带有扩展方法的隐式类。隐式转换是一种较旧的编程模式,在现代 Scala 代码中不受欢迎。幸运的是,当您这样做时,编译器会警告您。您必须通过在文件中导入JsonWriter
来手动启用隐式转换scala.language.implicitConversions
任何人都可以总结一下为什么隐式转换被弃用吗?有哪些限制或问题?为什么带有隐式参数的方法更好?
注意我知道如何很好地使用现代方法,包括隐式链接和所有。我只是好奇问题是什么以及为什么它被弃用。
Scala 的发明者 Martin Odersky 表示,隐式(和隐式转换)在 scala 3.1 中已被弃用,最终将从语言中完全删除。
隐式功能将被扩展方法和给定所取代。扩展方法和给定提供了更严格的功能解决方案,不会引入隐式引起的毫无戒心和隐藏的副作用。 Odersky 现在将隐式视为“灾难的秘诀”并且“过于隐式”,这就是他在 3.x 中替换其功能的动机。
https://www.slideshare.net/Lightbend/scala-3-is-coming-martin-odersky-shares-what-to-know
从 Scala 3.3 开始,隐式转换并未被弃用。
...在 Scala 2 中,隐式转换还用于为封闭类提供附加成员(请参阅隐式类)。在 Scala 3 中,我们建议通过定义扩展方法而不是隐式转换来解决此用例(尽管由于历史原因标准库仍然依赖于隐式转换)。
用于扩展封闭类的隐式转换已被扩展方法所取代,但隐式转换仍然存在并有其用途。
避免隐式转换有几个原因:
因为如果不加区别地使用隐式转换可能会出现陷阱,因此编译器会在两种情况下发出警告:
- 编译 Scala 2 风格的隐式转换定义时。
- 在调用站点,给定的
实例作为转换插入。scala.Conversion
要关闭警告,请执行以下任一操作:
- 将
导入到以下范围:scala.language.implicitConversions
- Scala 2 风格的隐式转换定义
- 调用插入给定
实例作为转换的站点。scala.Conversion
- 使用
调用编译器-language:implicitConversions