为什么 Scala 3 不能从 Scala 2 隐式转换中召唤 Conversion 实例?

Why can't Scala 3 summon a Conversion instance from a Scala 2 implicit conversion?

提问人:steinybot 提问时间:10/10/2023 更新时间:10/10/2023 访问量:33

问:

为什么 Scala 3 不能从 Scala 2 隐式转换中召唤实例?Conversion

import scala.language.implicitConversions

case class A(name: String)

case class B(name: String)

implicit def aToB(a: A): B = B(a.name)

// Works
summon[A => B]

// Fails with: No given instance of type Conversion[Playground.A, Playground.B] was found for parameter x of method summon in object Predef
summon[Conversion[A, B]]

我正在编写一个 Scala 3 库,我想使用新的,但是它无法找到转换来自第三方库的实例,该库是 Scala 3 库,但仍使用旧的隐式转换样式。现在看来,要使我的库兼容,我需要期待旧样式。这似乎是一个滑坡,倒退到一切都停留在旧样式上。我错过了什么吗?Conversion

隐式转换 Scala-3

评论

1赞 Luis Miguel Mejía Suárez 10/10/2023
您可能可以定义 yourself 并将其委托给现有的Conversionimplicit def
0赞 steinybot 10/10/2023
好吧,不是我,我的图书馆的用户将不得不这样做,这对他们来说是一个烦人的负担。如果我的库需要隐式转换函数而不是 .Conversion
0赞 Daenyth 10/10/2023
周围的摩擦是非常有意的,因为它几乎总是一个引起痛苦的坏主意。一般来说,你只想在两种类型真正同构时使用,即你可以任意地做,而不会丢失信息。正常的 api 设计不应该使用它们ConversionConversionA=>BB=A
0赞 steinybot 10/11/2023
那不是真的。 具有最小的摩擦力,当然不需要同构。许多 API 都从中受益。它甚至不必隐式进行转换,它通常可以像任何其他类型类一样使用。Scala 3 中的更改是为了鼓励我们更明确地表明需要转换。和 之间缺乏兼容性意味着想要转换的图书馆作者会坚持使用 .ConversionConversionimplicit defimplicit def

答: 暂无答案